迭代实现二叉树的遍历(算法村第七关黄金挑战)

news2024/9/22 4:00:29

迭代实现前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

题解的迭代方式

因为在递归的过程中使用了系统栈,所以在迭代的解法中常用 Stack 来模拟系统栈,来模拟递归。

首先创建一个 Stack 用来存放节点,此时 Stack 为空,优先将根结点加入 Stack,然后进行相关处理(打印、加入列表等等)。

之后我们应该先处理左子树,然后右子树。所以先加入 Stack 的应该是右子树,然后左子树。

在这里插入图片描述

public List<Integer> preorderTraversal(TreeNode root)
{
    //树中节点数目在范围 [0, 100] 内
    if (root == null)
        return new ArrayList<>();

    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();
    stack.add(root);

    while (!stack.isEmpty())
    {
        TreeNode node = stack.pop();
        answer.add(node.val);

        if (node.right != null)
            stack.push(node.right);
        if (node.left != null)
            stack.push(node.left);
    }

    return answer;
}

算法村的迭代方式

public List<Integer> preorderTraversal_3(TreeNode root)
{
    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();

    //再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树
    //不需要往栈中提前添加根结点!!!
    while (!stack.isEmpty() || root != null)
    {
        while (root != null)
        {
            answer.add(root.val);
            stack.push(root);
            //先遍历左子树
            root = root.left;
        }

        TreeNode curNode = stack.pop();
        //再遍历右子树
        root = curNode.right;
    }

    return answer;
}

迭代实现中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)

中序遍历是左中右,先访问二叉树左子树的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(把节点的val放进 answer 列表中)

当处理完最小单位的子树时,返回到上层处理中间节点。如果有右节点,也要就其进行中序遍历。

public static List<Integer> inorderTraversal(TreeNode root)
{
    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();

    //再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树
    //不需要往栈中提前添加根结点!!!
    while (!stack.isEmpty() || root != null)
    {
        while (root != null)
        {
            stack.push(root);
            root = root.left;
        }

        TreeNode curNode = stack.pop();
        answer.add(curNode.val);

        root = curNode.right;
    }

    return answer;
}

迭代实现后序遍历

145. 二叉树的后序遍历 - 力扣(LeetCode)

在这里插入图片描述

将后序遍历序列反转后得到的序列是“中右左”,而前序遍历序列是“中左右”。所有,我们将前序遍历的遍历次序改变一下,再把结果完全反转,即可得到所要的后序遍历序列。

public List<Integer> postorderTraversal(TreeNode root)
{
    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();

    //再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树
    //不需要往栈中提前添加根结点!!!
    while (!stack.isEmpty() || root != null)
    {
        while (root != null)
        {
            answer.add(root.val);
            stack.push(root);
            //先遍历右子树
            root = root.right;
        }

        TreeNode curNode = stack.pop();
        //再遍历左子树
        root = curNode.left;
    }

    //反转“右前序遍历”的序列,得到后序遍历的序列
    Collections.reverse(answer);

    return answer;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361141.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法每日一题: 被列覆盖的最多行数 | 二进制 - 状态压缩

大家好&#xff0c;我是星恒 今天的题目又是一道有关二进制的题目&#xff0c;有我们之前做的那道 参加考试的最大学生数的 感觉&#xff0c;哈哈&#xff0c;当然&#xff0c;比那道题简单多了&#xff0c;这道题感觉主要的考点就是二进制&#xff0c;大家可以好好总结一下这道…

栅极驱动芯片三种隔离技术

栅极驱动芯片三种隔离技术 1.栅极驱动器概述2.隔离栅极驱动芯片2.1隔离驱动器重要指标 3.三种常见隔离技术3.1光隔离3.2变压器隔离/磁隔3.3电容隔离 4.三种隔离器性能对比 1.栅极驱动器概述 栅极驱动器&#xff0c;在任何功率水平为任何应用高效可靠地驱动任何功率开关。 比如M…

我的2023年总结:往前看,别回头

2023年已经结束&#xff0c;我借此机会回顾一下我的2023年&#xff0c;同时也为2024年立好flag。 文章目录 2023印象深刻的实战经历技术成长与规划技术分享与交流CSDN博客参加百度apollo技术讨论会 深入学习Redis源码多彩的生活张杰演唱会《漫长的季节》&#xff1a;往前看&am…

【unity小技巧】FPS游戏实现相机的震动、后坐力和偏移

最终效果 文章目录 最终效果前言相机的震动实现后坐力和偏移相机震动相机震动脚本换弹节点震动 武器射击后退效果完结 前言 关于后坐力之前其实已经分享了一个&#xff1a;FPS游戏后坐力制作思路 但是实现起来比较复杂&#xff0c;如果你只是想要简单的实现&#xff0c;可以看…

R304S 指纹识别模块指令系统二

(16) 读索引表 PS_ReadIndexTable 功能说明&#xff1a;读取录入模版的索引表 输入参数&#xff1a;索引表页码&#xff0c;页码 0&#xff0c;1&#xff0c;2&#xff0c;3…分别对应模版从 0-256&#xff0c;256-512&#xff0c;512-768&#xff0c;768-1024…的索引&#…

玩转Python:用Python处理文档,5个必备的库,特别实用,附代码

在Python中&#xff0c;有几个流行的库用于处理文档&#xff0c;包括解析、生成和操作文档内容。以下是一些常用的库及其简介和简单的代码示例&#xff1a; PyPDF2 - 用于处理PDF文件。 简介&#xff1a;PyPDF2是一个纯Python库&#xff0c;用于分割、合并、转换和提取PDF文件中…

IDEA2023 最新版详细图文安装教程(Java环境搭建+IDEA安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说&#xff1a;工欲善其事&#xff0c;必先利其器。——《论语》 作者&#xff1a;Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

pycharm indent rainbow插件

设置自定义颜色&#xff1a; 4DF0FFFF,4DE1FFFF,4DFFFACD,4DAFEEEE 前两位为4D&#xff0c;后面4位为RGB颜色表中的字 颜色表&#xff1a;RGB颜色对照表

『华为云耀云服务器实战』|云服务器如何快速搭建个人博客(图文详解)

文章目录 引言一、云耀云服务器L实例介绍1.1 准备一个华为云耀云服务器1.2 重置实例密码1.3 利用xshell 远程连接 二、安装环境软件2.1 安装git准备远程拉取2.2 安装Docker 和 Docker compose 三、博客开源项目介绍3.1 操作界面展览 四、拉取项目搭建个人博客4.1 拉取项目进行配…

书摘:C 嵌入式系统设计模式 06

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述原书第 2 章的内容。 作为嵌入…

运维工程师的出路

运维工程师的出路到底在哪里&#xff1f; 你是不是也常常听到身边的运维人员抱怨&#xff0c;他们的出路到底在哪里呢&#xff1f;别着急&#xff0c;让我告诉你&#xff0c;运维人员就像是IT界的“万金油”&#xff0c;他们像“修理工”一样维修服务器&#xff0c;像“消防员…

专业级的渗透测试服务,助力航空业数字化安全启航

​某知名航空公司是中国首批民营航空公司之一&#xff0c;运营国内外航线200多条&#xff0c;也是国内民航最高客座率的航空公司之一。在数字化发展中&#xff0c;该航空公司以数据驱动决策&#xff0c;通过精细化管理、数字创新和模式优化等方式&#xff0c;实现了精准营销和个…

0基础学习VR全景平台篇第134篇:720VR全景,云台调整节点

相机、云台和脚架全套设备组装完成后需要进行调校才能开始拍摄。这一节&#xff0c;我们将主要介绍云台调整的两个内容&#xff1a;对中心靶、调三点一线。&#xff08;后附调校原理&#xff09; 云台部件名称 一、调节准备 &#xff08;一&#xff09;对于安装好的云台 1.检…

基础面试题整理1

1.面向对象的特点 继承&#xff08;复用性&#xff09;、封装&#xff08;复用性&#xff09;、多态&#xff08;可移植性、灵活性&#xff09; 2.ArrayList与LinkedList区别 ArrayList和LinkedList都是实现了List接口 ArrayList底层是动态数组 LinkedList底层是链表&#…

人工智能:模拟人类智慧的科技奇迹

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;作为一项模拟人类智慧行为的科学与技术&#xff0c;正以惊人的速度改变着我们的世界。它旨在让计算机系统具备感知、推理、学习、决策和交互等人类智慧的能力&#xff0c;成为当今科技领域的巨大突破…

分布式系统架构设计之分布式缓存技术选型

一、概述 随着互联网业务的快速发展&#xff0c;分布式系统已经成为了解决大规模并发请求、高可用性、可扩展性等问题的重要手段。在分布式系统中&#xff0c;缓存作为提高系统性能的关键技术&#xff0c;能够显著降低数据库负载、减少网络延迟、提高数据访问速度。当面对大量…

C# visual studio COM创建及调用

1.visual studuio操作 1.1visual Studio创建类库项目ClassLibrary1。 1.1.1ClassLibrary1项目Class1.cs内容如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.T…

java基于ssm的线上选课系统的设计与实现论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对学生选课信息管理的提升&#x…

MATLAB习题操作实战

2.1创建一个有7个元素的一维数组&#xff0c;并做如下处理:直接寻访一维数组的第6个元素;寻访一维数组的第1、3、5个元素;寻访一维数组中第4个至最后1个元素;寻访一维数组中大于70的元素。 % 创建一维数组 array [50, 60, 70, 80, 90, 100, 110];% 直接寻访一维数组的第6个元…

图像处理中的DCT变换

图像处理中的DCT变换 Discrete Cosine Transform&#xff0c;离散余弦变换。 来源及公式推导&#xff0c;可以查看下面链接&#xff0c;介绍的比较详细&#xff0c;这里就不再重复说明了&#xff1a; 详解离散余弦变换&#xff08;DCT&#xff09; - 知乎 (zhihu.com)DCT变换…