Iteratively Traverse BSTs

update Jun 21, 2017

LeetCode problems: Inorderarrow-up-right Preorderarrow-up-right Postorderarrow-up-right

这里所讲的BST Traversal方法指的主要是preorder, inorder, postorder,严格意义上三种都属于DFS。用recursion做BST的Traversal比较简单,思路很直接,但是如果要用Iterative的方法,就要用到stack,没有那么直观。这里主要提供三种遍历的java实现。

Preorder

这个显然最简单,先root,再左右,直接上代码。

    // java
    private void helper(TreeNode root) {
        Deque<TreeNode> stack = new LinkedList<>();
        if (root != null) stack.add(root);
        while (stack.size() > 0) {
            TreeNode curr = stack.removeLast();
            System.out.print(" " + curr.val);
            if (curr.right != null) stack.add(curr.right);
            if (curr.left != null) stack.add(curr.left);
        }
    }

Inorder

Inorder 稍微复杂一些,可以画示意图理解。

基本算法是先一路向左,push in stack。然后keep popping,visit each node之后检查其是否有 right child, 如果有,把 right child 当做 root,一路向左,push in stack。

Postorder

这道题目在LeetCode里居然是hard。。这或许是我见过的最草率的hard题目了,233333;LeetCodearrow-up-right

Postorder 是最复杂的,有两种实现方法,一种用两个stack,另一种只用一个。这里提供只用一个stack的。

基本思想是先像 inorder 一样把node一路向左 push in stack。然后每次检查stack.peek,如果peek 没有right child 或者 peek.right == prev即右孩子刚刚 visited 过,说明该node的右子树刚刚被visit,则 visit 这个 peek, 将其出栈,并把它赋给 prev。如果peekright child且没有 visited 过,则把 right 当做root,一路向左 push in stack。

注意: 这个方法是可以求该 BST 的 max hight 的,就是 stack 的最大 size

update Jan 14,2018 0:59

Update

Postorder traversal, two stacks solution

代码比较简单,但是不太好描述,可以画图理解。

需要注意的是这种思路虽然也work,但是性能非常不好,因为要完成 postorder traversal,这种思路需要先完成所有的遍历,之后才能开始输出节点,所以更加推荐之前的那种。