二叉树前中后序遍历 迭代法 只需一招!

核心思想

以中序遍历为例

在迭代法中 我们拿到 1 节点 由于有左孩子 我们就会推入 2 节点,2 节点又有左孩子, 所以我们推入 4 然后弹出, 接着弹出 2 节点, 由于这是第二次访问 2 节点, 也就意味着左子树已经去过了, 所以推入 5 节点。

那么我们模拟一下 栈的变化
假设左边为栈顶。

1 -> 21 -> 421-> 21 -> 51 -> 1 -> 3

所以 每当一个节点我们访问到第二次的时候就是输出节点值的时候
那么我们可以每次入栈的时候 标记下节点的访问次数:
"first" -> 第一次
"second" -> 第二次

对于第一次访问的节点 我们依次推入他的 右中左 节点 这样从栈顶往下看 就是 左中右的顺序,也就是中序的顺序。
对于第二次访问的节点 我们记录他的节点值就好

来模拟一下 左边依然是栈顶

1 -> 213 -> 42513 -> 2513 -> 513 -> 13 -> 3

代码

中序遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        LinkedList<Object> stack = new LinkedList<>();
        stack.addFirst(root);
        stack.addFirst("first");
        while(!stack.isEmpty()){
            String cnt = (String) stack.pollFirst();
            TreeNode cur = (TreeNode) stack.pollFirst();
            if(cur == null)
                continue;
            if(cnt.equals("first")){
                stack.addFirst(cur.right);
                stack.addFirst("first");

                stack.addFirst(cur);
                stack.addFirst("second");

                stack.addFirst(cur.left);
                stack.addFirst("first");

            }else{
                res.add(cur.val);
            }
        }
        return res;
    }
}

前序遍历

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        LinkedList<Object> stack = new LinkedList<>();
        stack.addFirst(root);
        stack.addFirst("first");
        while(!stack.isEmpty()){
            String p = (String) stack.pollFirst();
            TreeNode cur = (TreeNode) stack.pollFirst();
            if(cur == null)
                continue;
            if(p.equals("first")){
                stack.addFirst(cur.right);
                stack.addFirst("first");

                stack.addFirst(cur.left);
                stack.addFirst("first");

                stack.addFirst(cur);
                stack.addFirst("second");

            }else{
                res.add(cur.val);
            }
        }
        return res;
    }
}

后序遍历

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        LinkedList<Object> stack = new LinkedList<>();
        stack.addFirst(root);
        stack.addFirst("first");
        while(!stack.isEmpty()){
            String cnt = (String) stack.pollFirst();
            TreeNode cur = (TreeNode) stack.pollFirst();
            if(cur == null)
                continue;
            if(cnt.equals("first")){
                stack.addFirst(cur);
                stack.addFirst("second");

                stack.addFirst(cur.right);
                stack.addFirst("first");
                
                stack.addFirst(cur.left);
                stack.addFirst("first");

            }else{
                res.add(cur.val);
            }
        }
        return res;
    }
}
posted @ 2024-04-30 16:16  Shie1d  阅读(5)  评论(0编辑  收藏  举报