欢迎访问宙启技术站
智能推送

Java中如何实现二叉树遍历函数?

发布时间:2023-09-30 01:00:37

在Java中,实现二叉树的遍历函数可以利用递归或者迭代的方法。下面将分别介绍这两种方法。

1. 递归遍历法:

递归遍历二叉树的方法有前序遍历、中序遍历和后序遍历。

(1)前序遍历:

前序遍历的顺序是先访问根节点,然后递归遍历左子树,最后递归遍历右子树。

public void preOrderTraversal(TreeNode root) {
    if (root != null) {
        System.out.print(root.val + " ");  // 访问根节点
        preOrderTraversal(root.left);  // 递归遍历左子树
        preOrderTraversal(root.right);  // 递归遍历右子树
    }
}

(2)中序遍历:

中序遍历的顺序是先递归遍历左子树,然后访问根节点,最后递归遍历右子树。

public void inOrderTraversal(TreeNode root) {
    if (root != null) {
        inOrderTraversal(root.left);  // 递归遍历左子树
        System.out.print(root.val + " ");  // 访问根节点
        inOrderTraversal(root.right);  // 递归遍历右子树
    }
}

(3)后序遍历:

后序遍历的顺序是先递归遍历左子树,然后递归遍历右子树,最后访问根节点。

public void postOrderTraversal(TreeNode root) {
    if (root != null) {
        postOrderTraversal(root.left);  // 递归遍历左子树
        postOrderTraversal(root.right);  // 递归遍历右子树
        System.out.print(root.val + " ");  // 访问根节点
    }
}

2. 迭代遍历法:

使用迭代的方法实现二叉树的遍历需要借助辅助数据结构,如栈或队列。

(1)前序遍历:

前序遍历的非递归实现可以使用栈来辅助实现。

public void preOrderTraversal(TreeNode root) {
    if (root == null) {
        return;
    }
    
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        System.out.print(node.val + " ");
        
        // 先压入右子树,再压入左子树,保证左子树先遍历
        if (node.right != null) {
            stack.push(node.right);
        }
        if (node.left != null) {
            stack.push(node.left);
        }
    }
}

(2)中序遍历:

中序遍历的非递归实现需要利用栈来跟踪遍历过程。

public void inOrderTraversal(TreeNode root) {
    if (root == null) {
        return;
    }
    
    Stack<TreeNode> stack = new Stack<>();
    TreeNode curr = root;
    
    while (curr != null || !stack.isEmpty()) {
        while (curr != null) {
            stack.push(curr);
            curr = curr.left;
        }
        
        curr = stack.pop();
        System.out.print(curr.val + " ");
        
        curr = curr.right;
    }
}

(3)后序遍历:

后序遍历的非递归实现需要使用两个栈来辅助实现。

public void postOrderTraversal(TreeNode root) {
    if (root == null) {
        return;
    }
    
    Stack<TreeNode> stack1 = new Stack<>();
    Stack<TreeNode> stack2 = new Stack<>();
    
    stack1.push(root);
    
    while (!stack1.isEmpty()) {
        TreeNode node = stack1.pop();
        stack2.push(node);
        
        if (node.left != null) {
            stack1.push(node.left);
        }
        if (node.right != null) {
            stack1.push(node.right);
        }
    }
    
    while (!stack2.isEmpty()) {
        System.out.print(stack2.pop().val + " ");
    }
}

通过递归或者迭代的方法,可以实现二叉树的前序、中序和后序遍历。根据具体的需求和情况,选择适合的方法来实现二叉树的遍历函数。