【五一专栏】1. 迭代版二叉树的前、中、后序遍历

简介: 【五一专栏】1. 迭代版二叉树的前、中、后序遍历

前序遍历

思路

  • 对于前序来说,遍历的时候访问顺序是:中 - 左 - 右
  • 我们在进行迭代的时候,利用的是 Stack(先进后出) 这种数据结构
  • 我们遍历的顺序如下图所示:
  • 因为我们的出栈顺序为:左 右,所以压栈的顺序为:右 左

题目代码

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root == null){
            return list;
        }
        stack.add(root);
        // 中左右 
        // 压栈:右左
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.right != null){
                stack.add(node.right);
            }
            if(node.left != null){
                stack.add(node.left);
            }
        }
        return list;
    }
}

中序遍历

思路

  • 对于中序遍历来说,我们遍历的顺序是:左 - 中 - 右
  • 我们使用的数据结构还是 Stack
  • 我们遍历的顺序如下图所示:
  • 终止而言,对于这种递归的操作,不要去思考全局,要做好当前的操作,再去递归。

题目代码

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root == null){
            return list;
        }
        while(!stack.isEmpty() || root != null){
            while(root != null){
                stack.add(root);
                root = root.left;
            }
            TreeNode node = stack.pop();
            list.add(node.val);
            root = node.right;
        }
        return list;
    }
}

后序遍历

思考

  • 对于后序遍历,遍历的顺序是:左 - 右 - 中,而前序遍历为:中 - 左 - 右
  • 我们只需要在前序遍历的代码改一下
  • 我们可以思考一下,前序中为什么会有 先添加 root.right 再添加 root.left 的操作?
  • 主要就是在 Stack 弹出的时候,按照这个添加顺序,会优先弹出我们的 root.left 再弹出我们的 root.right,达到 中 - 左 - 右 的顺序
  • 我们假如换一下添加的顺序,比如:先添加 root.left 再添加 root.right,这样的话,弹出的时候,就会按照 中 - 右 - 左 的顺序
  • 可能这时候你还没看出来蹊跷,假如把这个顺序翻转一下,得到 左 - 右 - 后
  • 这是不是就是我们的后序遍历了

题目代码

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if(root == null){
            return list;
        }
        stack.add(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            list.add(node.val);
            if(node.left != null){
                stack.add(node.left);
            }
            if(node.right != null){
                stack.add(node.right);
            }
        }
        Collections.reverse(list);
        return list;
    }
}


相关文章
|
4月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
7月前
二叉树刷题记(二-中序遍历)
二叉树刷题记(二-中序遍历)
|
7月前
|
算法
二叉树刷题记(三-后序遍历)
二叉树刷题记(三-后序遍历)
|
7月前
|
算法
刷题专栏(十三):二叉搜索树的最近公共祖先
刷题专栏(十三):二叉搜索树的最近公共祖先
44 0
【剑指offer】-二叉树的深度-36/67
【剑指offer】-二叉树的深度-36/67
|
程序员
程序员怎能不会二叉树系列(二)二叉树的四种遍历
程序员怎能不会二叉树系列(二)二叉树的四种遍历
剑指offer 59. 二叉树的深度
剑指offer 59. 二叉树的深度
59 0
剑指offer 55 二叉树的深度
DFS深度优先二叉树无非就那几个步骤
代码随想录刷题|二叉树的理论基础、 二叉树的遍历 LeetCode 144、145、94、120(上)
代码随想录刷题|二叉树的理论基础、 二叉树的遍历 LeetCode 144、145、94、120
|
算法
LeetCode 104. 二叉树的最大深度 | 算法-从菜鸟开始i
LeetCode 104. 二叉树的最大深度 | 算法-从菜鸟开始i
141 0