📜  inorder, PreOrder, PostOrder java (1)

📅  最后修改于: 2023-12-03 15:15:50.439000             🧑  作者: Mango

Java中的Inorder、Preorder和Postorder遍历

在二叉树中,有三种基本遍历方式:Inorder(中序遍历)、Preorder(前序遍历)和Postorder(后序遍历)。在Java中,我们可以使用递归或迭代的方式实现这些遍历方式。本文将介绍如何在Java中实现这三种遍历方式。

Inorder遍历

在Inorder遍历中,我们首先遍历左子树,然后遍历当前节点,最后遍历右子树。

使用递归方法实现Inorder遍历
public void inOrderTraversal(TreeNode root) {
    if (root != null) {
        inOrderTraversal(root.left);
        System.out.print(root.val + " ");
        inOrderTraversal(root.right);
    }
}

这里我们将递归访问左子树,然后访问当前节点,并最后访问右子树。

使用迭代方法实现Inorder遍历
public void inOrderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode current = root;

    while (!stack.isEmpty() || current != null) {
        while (current != null) {
            stack.push(current);
            current = current.left;
        }

        current = stack.pop();
        System.out.print(current.val + " ");
        current = current.right;
    }
}

这里我们使用了一个栈来实现Inorder遍历。我们首先将左子树的所有节点都压入栈中,直到找到最左边的节点。然后我们把栈中最上面的节点出栈并打印出来。接着我们访问右子树。重复这个过程直到所有节点都遍历一遍。

Preorder遍历

在Preorder遍历中,我们首先访问当前节点,然后遍历左子树,最后遍历右子树。

使用递归方法实现Preorder遍历
public void preOrderTraversal(TreeNode root) {
    if (root != null) {
        System.out.print(root.val + " ");
        preOrderTraversal(root.left);
        preOrderTraversal(root.right);
    }
}

这里我们首先访问当前节点,然后访问左子树并访问右子树。

使用迭代方法实现Preorder遍历
public void preOrderTraversal(TreeNode root) {
    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);
        }
    }
}

这里我们使用了一个栈来实现Preorder遍历。我们首先将根节点压入栈中。然后我们不断地从栈中弹出节点,并打印出来。我们按照从右到左的顺序把右节点压入栈中,然后按照从右到左的顺序把左节点压入栈中。

Postorder遍历

在Postorder遍历中,我们首先遍历左子树,然后遍历右子树,最后访问当前节点。

使用递归方法实现Postorder遍历
public void postOrderTraversal(TreeNode root) {
    if (root != null) {
        postOrderTraversal(root.left);
        postOrderTraversal(root.right);
        System.out.print(root.val + " ");
    }
}

这里我们将递归访问左子树,然后递归访问右子树,并最后访问当前节点。

使用迭代方法实现Postorder遍历
public void postOrderTraversal(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode current = root;
    TreeNode lastVisited = null;

    while (!stack.isEmpty() || current != null) {
        if (current != null) {
            stack.push(current);
            current = current.left;
        } else {
            TreeNode peekNode = stack.peek();
            if (peekNode.right != null && lastVisited != peekNode.right) {
                current = peekNode.right;
            } else {
                System.out.print(peekNode.val + " ");
                lastVisited = stack.pop();
            }
        }
    }
}

这里我们使用了一个栈来实现Postorder遍历。我们首先将根节点压入栈中。然后我们不断地从栈中弹出节点,并打印出来。如果弹出的节点的右节点为空或者已经被访问过,那么我们就可以打印出它的值了。否则,我们按照从右到左的顺序将右节点和左节点压入栈中。这里使用了一个lastVisited变量来记录上一次访问的节点,以确保我们不会重复访问同一个节点。

总结

本文介绍了Java中的Inorder、Preorder和Postorder遍历的递归和迭代实现。如果您想了解更多关于二叉树的内容,可以参考我的其他文章。