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

Java中的二叉树遍历函数是什么?

发布时间:2023-06-23 20:11:41

Java中的二叉树遍历函数有三种,分别是前序遍历、中序遍历和后序遍历。这三种遍历方式是二叉树最基本的遍历方式,它们分别都有自己的递归实现方式和非递归实现方式。

1. 前序遍历

前序遍历的顺序是先访问根节点,再访问左子树,最后访问右子树。具体实现步骤如下:

① 如果根节点不为空,则打印根节点的值。

② 如果左子树不为空,则递归遍历左子树。

③ 如果右子树不为空,则递归遍历右子树。

Java代码实现:

// 递归实现

public void preorderTraversal(TreeNode root) {

    if (root != null) {

        System.out.print(root.val + " ");

        preorderTraversal(root.left);

        preorderTraversal(root.right);

    }

}

// 非递归实现

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. 中序遍历

中序遍历的顺序是先访问左子树,再访问根节点,最后访问右子树。具体实现步骤如下:

① 如果左子树不为空,则递归遍历左子树。

② 如果根节点不为空,则打印根节点的值。

③ 如果右子树不为空,则递归遍历右子树。

Java代码实现:

// 递归实现

public void inorderTraversal(TreeNode root) {

    if (root != null) {

        inorderTraversal(root.left);

        System.out.print(root.val + " ");

        inorderTraversal(root.right);

    }

}

// 非递归实现

public void inorderTraversal(TreeNode root) {

    if (root == null) {

        return;

    }

    Stack<TreeNode> stack = new Stack<>();

    TreeNode node = root;

    while (node != null || !stack.isEmpty()) {

        while (node != null) {

            stack.push(node);

            node = node.left;

        }

        node = stack.pop();

        System.out.print(node.val + " ");

        node = node.right;

    }

}

3. 后序遍历

后序遍历的顺序是先访问左子树,再访问右子树,最后访问根节点。具体实现步骤如下:

① 如果左子树不为空,则递归遍历左子树。

② 如果右子树不为空,则递归遍历右子树。

③ 如果根节点不为空,则打印根节点的值。

Java代码实现:

// 递归实现

public void postorderTraversal(TreeNode root) {

    if (root != null) {

        postorderTraversal(root.left);

        postorderTraversal(root.right);

        System.out.print(root.val + " ");

    }

}

// 非递归实现

public void postorderTraversal(TreeNode root) {

    if (root == null) {

        return;

    }

    Stack<TreeNode> stack = new Stack<>();

    TreeNode pre = null;

    stack.push(root);

    while (!stack.isEmpty()) {

        TreeNode node = stack.peek();

        if ((node.left == null && node.right == null) || (pre != null && (pre == node.left || pre == node.right))) {

            System.out.print(node.val + " ");

            pre = node;

            stack.pop();

        } else {

            if (node.right != null) {

                stack.push(node.right);

            }

            if (node.left != null) {

                stack.push(node.left);

            }

        }

    }

}

总结:

以上就是Java中的三种二叉树遍历方式,它们都有递归和非递归两种实现方式。对于一般的二叉树问题,递归实现方式较为简单直观,非递归实现方式则需要注意一些细节问题,例如在后序遍历中需要考虑节点的访问顺序等问题。在使用Java进行二叉树遍历时,可以根据具体问题场景选择合适的遍历方式和实现方式。