📜  迭代后序遍历 |第 1 组(使用两个堆栈)(1)

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

迭代后序遍历 |第 1 组(使用两个堆栈)

迭代后序遍历是一种用迭代方式实现的二叉树遍历方法,它可以按照后序遍历的顺序遍历二叉树。

这是一种使用两个堆栈实现迭代后序遍历的方法。

算法描述

我们用一个栈来保存二叉树的结点,另一个栈用于保存已经遍历过的结点。

我们首先将根结点入栈,然后循环以下步骤,直到栈为空:

  1. 从栈中弹出一个结点,并将其入第二个栈中。
  2. 将该结点的左子结点和右子结点按顺序入栈。

一旦栈为空,我们所有的结点就都被遍历了,而且它们的先后顺序是正确的。因为我们先将右子树入栈,然后才入左子树,所以第二个栈中的结点就是我们想要的后序遍历顺序。

代码实现
public static List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> result = new ArrayList<>();
    if (root == null) {
        return result;
    }

    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()) {
        result.add(stack2.pop().val);
    }

    return result;
}
时间复杂度

这种方法遍历每个结点恰好一次,所以时间复杂度为 O(n),其中 n 是结点的数量。

空间复杂度

这种方法使用了两个堆栈来存储结点,因此空间复杂度为 O(n),其中 n 是结点的数量。

总结

这种方法是一种简单而经典的迭代后序遍历方法,在面试中经常被问到,因此要熟悉其实现原理和代码实现。