LeetCode——二叉树的非递归遍历

news/2024/4/27 20:30:49/文章来源:https://blog.csdn.net/qq_63580639/article/details/130112704

144. 二叉树的前序遍历

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

在这里插入图片描述

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

示例 2

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

示例 3

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

示例 4
在这里插入图片描述

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

示例 5
在这里插入图片描述

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

提示

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

进阶

递归算法很简单,你可以通过迭代算法完成吗?

原题链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/

思路
将一棵树分成左路节点和左路节点的右子树。
在这里插入图片描述
那么迭代如何实现呢?这需要一个栈来储存结点。
在这里插入图片描述
先从头结点,访问到左子树的空为止,但是再这个过程中要将经过的数放进一个数组中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不停的去访问左子树,到空就取栈顶然后pop掉,让结点指针指向栈顶结点的右子树就可以了,以此循环。
代码

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int>arr;//储存前序遍历的结果stack<TreeNode*>st;TreeNode* cur = root;while(!st.empty() || cur)//如果栈为空,并且cur指向了空,因为栈为空,cur指向的右子树说不定还有值{while(cur){arr.push_back(cur->val);//将结点值添加到arr中st.push(cur);//入栈cur = cur->left;}TreeNode* top = st.top();//取栈顶结点st.pop();//出栈cur = top->right;//访问栈顶元素的右子树}return arr;}
};

在这里插入图片描述

94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回它的中序遍历。
示例 1
在这里插入图片描述

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

示例 2

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

示例 3

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

提示

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

进阶:

递归算法很简单,你可以通过迭代算法完成吗?

原题链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/

思路
中序遍历和前序遍历没什么太大差别,只是插入数据的位置不同而已,要在出栈的时候访问栈顶的元素。

代码

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int>arr;//储存中序遍历的结果stack<TreeNode*>st;TreeNode* cur = root;while(!st.empty() || cur){while(cur){st.push(cur);//入栈cur = cur->left;}TreeNode* top = st.top();//取栈顶结点arr.push_back(top->val);//将结点值添加到arr中st.pop();//出栈cur = top->right;//访问栈顶元素的右子树}return arr;}
};

在这里插入图片描述

145. 二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的后序遍历。
示例 1
在这里插入图片描述

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

示例 2

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

示例 3

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

提示

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

进阶

递归算法很简单,你可以通过迭代算法完成吗?

原题链接:https://leetcode.cn/problems/binary-tree-postorder-traversal/

思路
利用栈的基本思路是不变的,在弹出的时候,加一个判断条件,判断该节点的左子树和右子树是否全都访问完毕,如果访问完毕才能放进数组中。
这里只需要加一个结点指针指向栈最后一个弹出的结点就可以了:
在这里插入图片描述
这里15结点已经从栈中弹出去了,然后是7也弹出去。
front就会指向cur的位置:
在这里插入图片描述
这个时候cur检测右子树是不是front就能知道右子树是不是已经被访问完毕了。

代码

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int>arr;//储存后序遍历的结果stack<TreeNode*>st;TreeNode* cur = root;TreeNode* front = nullptr;//记录最后上一个出栈的结点位置while(cur || !st.empty()){while(cur){st.push(cur);cur = cur -> left;}TreeNode* top = st.top();//如果栈顶节点右子树为空就说明该节点的左右子树都访问完毕了。//如果栈顶节点的右子树等于上个弹出的结点,那么也说明这该节点左右子树都访问完毕了。if(top->right == nullptr || top->right == front){st.pop();arr.push_back(top->val);front = top;}else{cur = top -> right;}}return arr;}
};

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDF怎么转CAD文件?(免费!高效转换方法汇总)

一般而言&#xff0c;PDF图纸是不能修改的。若需修改&#xff0c;则需将PDF转CAD&#xff0c;此时如何满足PDF转CAD的需求呢&#xff1f;今天&#xff0c;我将教你两种免费的PDF转CAD的方法&#xff0c;助力高效办公。 1.本地软件转换法 这是用本地软件转换方法&#xff0c;支…

JVM之GC日志解读

通过阅读Gc日志&#xff0c;我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc-XX:PrintGCDetails 输出GC的详细日志-XX:PrintGCTimestamps 输出GC的时间戳&#xff08;以基准时间的形式&#xf…

软件企业利用ChatGPT的正确姿势

先来看一下现在市场环境 ChatGPT作为现象级产品横空出世之后&#xff0c;极大地带动了大语言模型产业和生成式AI&#xff08;AIGC&#xff09;产业的蓬勃发展。海外市场上&#xff0c;OpenAI、微软、谷歌、Meta等巨头动作频频。中国市场更是风起云涌&#xff0c;百度、阿里、华…

Golang每日一练(leetDay0034) 二叉树专题(3)

目录 100. 相同的树 Same Tree &#x1f31f; 101. 对称二叉树 Symmetric Tree &#x1f31f; 102. 二叉树的层序遍历 Binary Tree Level-order Traversal &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一…

Talk预告 | 清华大学交叉信息研究院助理教授赵行:基于视觉感知的自动驾驶运动预测

本期为TechBeat人工智能社区第481期线上Talk&#xff01; 北京时间3月15日(周三)20:00&#xff0c;清华大学交叉信息研究院助理教授——赵行的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “基于视觉感知的自动驾驶运动预测”&#xff0c;届时将…

AIGC大模型时代下,该如何应用高性能计算PC集群打造游戏开发新模式?

ACT | SIM | ETC | FTG | RAC AVG | RPG | FPS | MUG | PUZ ACT、SIM、ETC、FTG、RAC、RTS、STG、AVG、RPG、FPS、MUG、PUZ、SLG、SPG等游戏类型&#xff0c;需要高性能的计算机来支持运行。为了满足这些游戏的需求&#xff0c;国内服务器厂商不断推出新的产品&#xff0c;采用…

AD20的PCB布线规则设定

目录 1、最小安全间距 2、线宽规则 3、过孔 4、盖油工艺设计 5、内电层焊盘模式设置 6、反焊盘间距设计 7、焊盘与覆铜连接类型 AD20的规则库设定是PCB布线的首要工作&#xff0c;在布线初期就要设置好&#xff0c;布线的过程中还需要动态的变更&#xff0c;因此本篇总结了PCB的…

基于逻辑回归构建肿瘤预测模型

使用逻辑回归构建肿瘤预测模型 描述 乳腺癌数据集包括569个样本&#xff0c;每个样本有30个特征值&#xff08;病灶特征数据&#xff09;&#xff0c;每个样本都属于恶性&#xff08;0&#xff09;或良性&#xff08;1&#xff09;两个类别之一&#xff0c;要求使用逻辑回归&…

九龙证券|服务器龙头获资金连续抢筹,尾盘主力抢筹前期大热门股

今天&#xff0c;核算机职业取得主力大手笔抢筹。 今天主力资金净流出53.89亿元&#xff0c;其间创业板净流出3.19亿元&#xff0c;沪深300成份股净流出7.61亿元。 申万一级职业中&#xff0c;今天有19个职业上涨&#xff0c;传媒职业接连两日均涨近5%&#xff0c;居首位&…

解密HTTP协议:探索其组成部分与工作原理

前言 欢迎来到今天的每日一题&#xff0c;每日一提。昨天有聊到&#xff0c;HTTP 和 HTTPS 之间有什么区别&#xff1f;面试官基本秉承着刨根问题的原则&#xff0c;肯定是不会轻易放过我们的&#xff0c;那么自然是要继续拷问了。所以我们今天就聊聊什么是 HTTP&#xff0c;它…

ERTEC200P-2 PROFINET设备完全开发手册(5-2)

5.2 TIA 数据记录操作 在PLC的程序中&#xff0c;可以通过指令RDREC和WRREC读写数据记录&#xff0c;在参考代码里可以看到读写操作都实现了index 2的记录数据&#xff0c;并且初始化为&#xff1a; #define DEMO_RECORD "ABCDEFGH" 首先定义要写入和读出的数据…

让技术造福残障人士,让开发助力无障碍

前言 随着互联网技术的快速发展&#xff0c;越来越多的领先技术运用到公益领域中来。运用科技来造福残障人士&#xff0c;比如前几年比较智能化的自动行走轮椅&#xff0c;盲人阅读器&#xff0c;以及聋哑人助听器等&#xff0c;都是通过科技来帮助残障人士方便生活的例子。作为…

pandas之DataFrame基础

pandas之DataFrame基础1. DataFrame定义2. DataFrame的创建形式3. DataFrame的属性4. DataFrame的运算5. pandas访问相关操作5.1 使用 loc[]显示访问5.2 iloc[] 隐式访问5.3 总结6. 单层索引和多层级索引6.1 索引种类与使用6.2 索引相关设置6.3 索引构造6.4 索引访问6.5 索引变…

【排序算法 上】带你手撕常见排序 (插入,希尔,选择,堆排序) (动图详解)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; “东风随春归&#xff0c;发我枝上花。” 前言&#xff1a; 排序是日常生活中极其常见的一种算法&#xff0c;它的功能很简单&#xff0c;就是将数字按照升序/降序排列&#xff0c;最终形成一组有序的数字&a…

NumPy 秘籍中文第二版:五、音频和图像处理

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们将介绍 NumPy 和 SciPy 的基本图像和音频&#xff08;WAV 文件&#xff09;处理。 在以下秘籍中&#xff0c;我们将使用 NumPy 对声音和图像进…

Redis锁的租约问题

目录Redis的租约问题Redis租约问题的想法Redis租约问题的解决方案Redis的租约问题 首先我们先来说一说什么是Redis的租约问题。   在我们实现Redis分布式锁的时候&#xff0c;我们会出现Redis锁的时间<业务执行执行时间&#xff0c;这其实就是一个典型的租约问题&#xf…

ChatGPT背后的AI背景、技术门道和商业应用(万字长文,建议收藏)

作者&#xff1a;京东科技 李俊兵 各位看官好&#xff0c;我是球神&#xff08;江湖代号&#xff09;。 自去年11月30日ChatGPT问世以来&#xff0c;迅速爆火出圈。 起初我依然以为这是和当年Transformer, Bert一样的“热点”模型&#xff0c;但是当一篇篇文章/报告不断推送…

LAMP架构的配置

一.LAMP概述 1、LAMP的概念 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态web站点服务及其应用开发环境 LAMP是一个缩写词&#xff0c;具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、…

【Unity入门】11.脚本控制物体旋转

【Unity入门】脚本控制物体旋转 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;控制物体自转 &#xff08;1&#xff09;创建RotateLogic脚本 上一篇文章我们学习了如何在脚本中获取物体对象…

Oracle VM VirtualBox安装开放麒麟桌面版本操作

1.环境 Oracle VM VirtualBox版本6.1.18 开放麒麟桌面版本openkylin 0.0.5 https://mirror.lzu.edu.cn/openkylin-cdimage/yangtze/openkylin-0.9.5-x86_64.iso 1.创建新虚拟电脑 ql 并将ios导入 然后点击启动 注意&#xff1a; vm box如果鼠标设置不当的话 基本上不可能完成…