【数据结构与算法 | 二叉树篇】二叉树的前中后序遍历(迭代版本)

news2024/11/25 19:29:22

1. 前言

前文我们实现了二叉树前中后三种遍历方式的递归版本,非常简单. 接下来我们来实现一下其迭代版本.

2. 二叉树的前序遍历

(1). 题

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

 

4f4241238c5f6f39b2eefa04fb8bf95b.jpeg

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

 

cfa471a10c82191fbb16c9d457db515c.jpeg

输入:root = [1,2]
输出:[1,2]

示例 5:

 

80c0a844be1cefc61cd7412c67c5eb8d.jpeg

输入:root = [1,null,2]
输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

(2). 思路

递归调用系统栈,迭代算法自己构造一个栈来模拟. cur指针指向根节点,while循环,条件只要cur不为空并且栈不为空,不断将元素添加到数组中(根),直到访问到最左的叶子节点(左). 此时将其从栈弹出,访问右节点(右). 如果该右节点为空,则继续弹栈,访问弹栈出的节点右节点.不断继续此过程.

(3). 解

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        Deque<TreeNode> stack = new LinkedList<>();
        TreeNode cur = root;
        TreeNode p;
        while (cur != null || !stack.isEmpty()){
            if (cur != null) {
                stack.push(cur);
                list.add(cur.val);
                cur = cur.left;
            } else {
                p = stack.pop();
                cur = p.right;
            }
        }
        return list;
    }
}

3. 二叉树的中序遍历

(1). 题

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

示例 1:

 

3b2da8f54d47998c00453fdad70b070d.jpeg

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

(2). 思路

while循环开始,如果cur不为null则一直压栈(左),直到cur为null,弹栈,并访问该节点(根),继续讨论该节点的右孩子(右). 继续弹栈,该节点的左孩子部分已经完成,访问该节点的值,继续讨论其右孩子.直到循环结束.

(3). 解

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

4. 二叉树的后序遍历

(1). 题

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

示例 1:

 

7946c3dde8d9e906f146604880196ac6.jpeg

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

(2). 思路

思路如下.

(3). 解

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> al = new ArrayList<>();
        if (root == null) {
            return al;
        }
        TreeNode cur = root;
        TreeNode pop = null;
        Deque<TreeNode> stack = new LinkedList<>();
        while (cur != null || !stack.isEmpty()){
            //只要cur不为null, 一直访问左节点, 并不断入栈
            if (cur != null) {
                stack.push(cur);
                cur = cur.left;
            } else {
                //此时栈顶元素的左孩子为null 即其左孩子无需处理
                    TreeNode peek = stack.peek();
                    //peek.right == null表明栈顶元素的右孩子无需处理
                    //peek.right == pop表明栈顶元素的右孩子已经处理完毕
                    if (peek.right == null || peek.right == pop){
                        //访问该栈顶元素, 并弹出
                        al.add(peek.val);
                        //记录处理的节点
                        pop = stack.pop();
                    } else {
                        //else表明该栈顶元素的右孩子待处理, 则cur = peek.right
                        cur = peek.right;
                    }
                }
        }
        return al;
    }
}

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

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

相关文章

【简单讲解下TalkingData】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

六位一线AI工程师总结Agent构建经验,天工SkyAgents的Agent构建实战。

原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 六位一线AI工程师总结Agent构建经验&#xff0c;天工SkyAgents的Agent构建实战。 &#x1f31f;我们给人类新手明确的目标和具体的计划&am…

ATFX汇市:加拿大央行已宣布降息25基点,欧央行降息预期大幅增强

ATFX汇市&#xff1a;加拿大中央银行6月利率决议宣布&#xff0c;将政策利率下调25个基点至4.75%&#xff0c;时隔4年零三个月后再次进入降息周期。以2023年7月份加拿大央行最后一次加息算起&#xff0c;5.5%的高利率维持了11个月&#xff0c;期间加拿大的核心通胀率从6.2%降低…

UE5刷植物悬空了

UE5系列文章目录 文章目录 UE5系列文章目录前言一、解决办法 前言 在Unreal Engine5.3中使用植物模式刷各种植物时&#xff0c;有时会发现有的植物要么悬空&#xff0c;要不有刷不上地板的情况。而且悬空的植物还不能接触到地面&#xff0c;感觉很奇怪&#xff0c;就像下图所示…

如何减少Apache Spark日志的数量

修改log4j配置文件&#xff0c;没有就创建&#xff1a; 内容&#xff1a; # 设置日志记录器 log4j.rootCategoryWARN, console log4j.appender.consoleorg.apache.log4j.ConsoleAppender log4j.appender.console.targetSystem.err log4j.appender.console.layoutorg.apache.lo…

数学题目系列(一)|丑数|各位和|埃氏筛|欧拉筛

一.丑数 链接&#xff1a;丑数 分析&#xff1a; 丑数只有2&#xff0c;3&#xff0c;5这三个质因数&#xff0c;num 2a 3b 5c也就是一个丑数是由若干个2&#xff0c;3&#xff0c;5组成&#xff0c;那么丑数除以这若干个数字最后一定变为1 代码 class Solution {publi…

27-unittest之断言(assert)

在测试方法中需要判断结果是pass还是fail&#xff0c;自动化测试脚本里面一般把这种生成测试结果的方法称为断言&#xff08;assert&#xff09;。 使用unittest测试框架时&#xff0c;有很多的断言方法&#xff0c;下面介绍几种常用的断言方法&#xff1a;assertEqual、assert…

基于javacv ffmpeg 使用原生ffmpeg命令

基于javacv ffmpeg 使用原生ffmpeg命令 1. ffmpeg2. ffprobe 相关阅读&#xff1a; javacv ffmpeg使用笔记 测试过程中&#xff0c;发现ffmpeg-6.0-1.5.9-linux-x86_64.jar 存在问题&#xff08;ffmpeg原生命令执行失败&#xff09;&#xff0c;降级到ffmpeg-5.1.2-1.5.8-linux…

【Python报错】已解决ValueError: If using all scalar values, you must pass an index

成功解决“ValueError: If using all scalar values, you must pass an index”错误的全面指南 在Pandas库中&#xff0c;当你尝试创建一个新的DataFrame或Series时&#xff0c;如果所有值都是标量&#xff08;scalar&#xff0c;即单个值而非列表、数组或Series&#xff09;…

Vuforia AR篇(六)— Mid Air 半空识别

目录 前言一、什么是Mid Air&#xff1f;二、使用步骤三、示例代码四、效果 前言 增强现实&#xff08;AR&#xff09;技术正在改变我们与数字世界的互动方式。Vuforia作为先进的AR开发平台&#xff0c;提供了多种工具来创造引人入胜的AR体验。其中&#xff0c;Mid Air功能以其…

UE5-AI

AI角色 角色控制器 AI角色必须要一个角色控制器 角色控制器最基本只需要执行行为树&#xff0c;在EventOnPossess后runBehaviorTree 如果要的是一个角色&#xff0c;可以创建一个Character&#xff0c;在类默认设置中可以找到 Pawn->AIControllerClass&#xff0c;在这里…

Linux网络的DHCP配置

文章目录 DHCP配置DHCP流程简述DHCP优点DHCP的分配方式DHCP的租约过程DHCP配置实验实验1实验2 DHCP配置 DHCP&#xff1a;动态主机配置协议 服务端和客户端 服务端&#xff1a;server&#xff0c;提供某种特定的服务 客户端&#xff1a;client&#xff0c;使用服务端提供的服…

代码随想录第26天|回溯part6 不需要搜索整棵树的回溯二维搜索

332.重新安排行程 难题&#xff0c;自己写的代码没过&#xff0c;但我认为逻辑没有问题 class Solution { public:vector<string> res;bool pruning(vector<string> res, vector<string> path) {if (res.size() 0)return true;bool check false;for (int …

fastapi学习前置知识点

前置知识点 FastApi&#xff1a;一个用于构建API的现代、快速&#xff08;高性能&#xff09;的web框架。 FastApi是建立在Pydantic和Starlette基础上&#xff0c;Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包…

Matlab|【重磅】配电网故障重构/孤岛划分

目录 1 主要内容 1.1 背景 1.2 流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》&#xff0c;采用matlab编程软件实现&#xff0c;依据网络结构和DG供电方式对配电网进行孤岛划分&#xff0c;将含…

避免使用for循环操作高维数组:numpy.apply_along_axis用法

文章目录 场景实际操作编写相关函数np.apply_along_axis 场景 设想我有一列高维向量&#xff0c;读取之后的数据都是字符串变量&#xff0c;我需要把这些字符串数据转换为复数之后求绝对值 实际操作 在使用pd.read_csv()读取数据之后&#xff0c;将这一列数据转换为numpy数…

Python高阶学习记录

文章导读 阅读本文需要一定的python基础&#xff0c;部分知识点是对python入门篇学习记录和python并发编程学习记录的深入探究&#xff0c;本文记录的Python知识点包括函数式编程&#xff0c;装饰器&#xff0c;生成器&#xff0c;迭代器&#xff0c;正则表达式&#xff0c;内存…

面试题------>JVM虚拟机!!!

一、Java对象内存布局 二、JVM 内存结构 程序计数器: 线程私有的(每个线程都有一个自己的程序计数器),是一个指针.代码运行,执行命令.而每个命令都是有行号的,会使用程序计数器来记录命令执行到多少行了.记录代码执行的位置. Java虚拟机栈: 线程私有的(每个线程都有一个自己…

【计算机网络】计算机网络的组成与功能

计算机网络的组成与功能 导读一、计算机网络的组成1.1 从组成方式上1.1.1 硬件1.1.2 软件1.1.3 协议 1.2 从工作方式上1.3 从功能组成上 二、计算机网络的功能2.1 数据通信2.2 资源共享2.3 分布式处理2.4 提高可靠性2.5 负载均衡2.6 其它 结语 导读 大家好&#xff0c;很高兴又…

可视化数据科学平台在信贷领域应用系列五:零代码可视化建模

信贷风控模型是金融机构风险管理的核心工具&#xff0c;在信贷风险管理工作中扮演着至关重要的角色。随着信贷市场的环境不断变化&#xff0c;信贷业务的风险日趋复杂化和隐蔽化&#xff0c;开发和应用准确高效的信贷风控模型显得尤为重要。信贷风险控制面临着越来越大的挑战和…