【五一专栏】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;
    }
}


相关文章
|
前端开发 JavaScript 数据可视化
标准微前端架构在蚂蚁的落地实践
蚂蚁金服前端技术专家有知在 D2 带来以“标准微前端架构在蚂蚁的落地实践”为题的演讲。首先提出了微前端的场景域在蚂蚁落地时常遇到的问题,然后详细介绍了微前端的定义,最后通过实施一个标准的微前端架构,提出面临的技术决策以及需要处理的技术细节,经过在蚂蚁的实践证明,微前端是一个具有优势的方案。
15571 0
标准微前端架构在蚂蚁的落地实践
|
6月前
|
运维 算法 安全
OSI 数据链路层详解
本文介绍了MAC地址的基本概念、结构及其在网络通信中的作用,同时详细解析了以太网帧的组成部分,包括前导码、目的地址、源地址、类型、数据和FCS等字段的功能与意义。此外,还阐述了CSMA/CD原理,涵盖载波监听、多路访问、冲突检测及冲突处理机制,帮助理解以太网在共享介质环境下的数据传输过程。
178 4
爆赞!终于有大佬把网络安全零基础入门教程给讲明白了!
网络安全的一个通用定义指网络信息系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的破坏、更改、泄露,系统能连续、可靠、正常地运行,服务不中断。网络安全简单的说是在网络环境下能够识别和消除不安全因素的能力。 网络安全在不同环境和应用中有不同的解释,例如系统运行的安全、系统信息内容的安全、信息通信与传播的安全等。 网络安全的主体是保护网络上的数据和通信的安全,数据安全性是指软硬件保护措施,用来阻止对数据进行非授权的泄漏、转移、修改和破坏等,通信安全性是通信保护措施,要求在通信中采用保密安全性、传输安全性、辐射安全性等措施。
|
7月前
|
运维 监控 Cloud Native
深度用云——释放企业潜能| 阿里云原生网络AIOps,助力企业深度用好云
深度用云——释放企业潜能| 阿里云原生网络AIOps,助力企业深度用好云
144 0
|
Prometheus 监控 Kubernetes
将service类型由"ClusterIP"改为"NodePort"无法使用nodeip+端口访问服务解决方法.
将service类型由"ClusterIP"改为"NodePort"无法使用nodeip+端口访问服务解决方法.
|
Kubernetes 应用服务中间件 nginx
云原生|kubernetes|ingress-nginx插件部署以及简单的应用(修订版---适用于kubernetes-1.18-1.21)
云原生|kubernetes|ingress-nginx插件部署以及简单的应用(修订版---适用于kubernetes-1.18-1.21)
485 0
|
敏捷开发 数据可视化 安全
如何选择低代码开发平台?必看注意事项揭秘!
低代码开发平台和零代码开发平台是近几年时兴的一种新的程序开发方法。该模式的特征是可以使用用户界面、拖拽操作等方式快速构建应用软件软件,从而减少开发者的学习标准,使每个人都能变成开发者。
230 0
|
移动开发 JavaScript 前端开发
vue/react项目刷新页面出现404的原因以及解决办法
vue/react项目刷新页面出现404的原因以及解决办法
1094 0
|
开发框架 UED 开发者
QML(Qt Quick) 按钮设计指南
QML(Qt Quick) 按钮设计指南
1001 0