【C++二叉树】二叉树的前序遍历、中序遍历、后序遍历递归与非递归实现

news2024/9/21 21:03:19

1.二叉树的前序遍历

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

前序遍历方式:根-左子树-右子树。

递归实现:

要传一个子函数来实先递归,原因是原函数返回值为vector,在原函数迭代,返回值就难处理了。

非递归(迭代)实现:

递归实现非常简单,非递归呢?

要用迭代实现,也就是循环:

还是按照根-左子树-右子树的遍历方式遍历。

遍历:先访问1、3、4再访问4的右子树再退回去访问3的右子树和1的右子树。

这时,我们可以把树分为左路节点和左路节点的右子树。

也就是先访问左路节点再访问左路节点的右子树,右子树也同样分为左路节点和左路节点的右子树。

这时,就要使用栈来解决:

  1. 把左路节点入栈,入栈的同时访问节点(遍历根),当左路节点为空时停止入栈,同时也证明左子树已经访问结束。
  2. 这时再访问左路节点的右子树。取栈顶数据(栈顶数据就是左路节点)的右子树,再把栈顶数据弹出。
  3. 右子树同样分为左路节点和左路节点的右子树,同样按照此方法迭代循环。
  4. 直到最后一个节点访问结束,此时,节点为空,栈为空。

自己根据代码,画一下图模拟迭代过程就容易理解了。

2.二叉树的中序遍历

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

中序遍历方式:左子树-根-右子树。

递归实现:

非递归(迭代)实现:

中序遍历的非递归和前序遍历的非递归思路类似。

  1. 都是按照把树分为左路节点和左路节点的右子树的思路来实现的,只不过访问节点(根)的时机不同。
  2. 前序遍历是先访问根再访问左子树右子树,所以在左路节点入栈的时候,就访问节点(根),而中序遍历是先访问左子树再访问根再访问右子树
  3. 所以中序遍历是在左路节点入栈完以后,再访问节点(根)。

3.二叉树的后序遍历

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

后序遍历方式:左子树-右子树-根

递归实现:

非递归迭代实现:

后序遍历方式:左子树-右子树-根

后序遍历的非递归与前序和中序的非递归整体思路类似。

唯一不同的就是访问节点的时机不同。

什么时候访问节点(根)呢?

  1. 从栈中取出左路节点时,节点的左子树已经访问完了(理解理解)。
  2. 当左路节点的右子树访问完才可以访问根。
  3. 如果左路节点的右子树为空,则代表右子树访问完,可以访问节点(根)了。
  4. 如果右子树不为空,则要先访问左路节点的右子树。

非递归迭代实现:

但是此时会发现超出了内存限制,说明代码有问题,内存限制问题一般就是死循环了。

按照上面的代码,会发现,节点3和节点5之间会一直死循环,

  1. 3的右子树不为空,把5入栈,5的右子树为空,把栈中5弹出来,下次循环又取了栈顶数据3,3的右子树不为空,把5入栈......
  2. 第二次访问节点3的时候,就应该直接访问节点(根)了,但他的右子树不为空,又访问了右子树,他不知道右子树已经访问过了,就会不断的进入3的右子树访问就死循环了。

所以,关键问题就说我们要想一个办法区分他的右子树到底访问过了没有,如果访问过了,则可以访问该左路节点(根)了,如果没有访问,则先访问他的右子树。

此时,可以使用双指针来解决,我们定义一个指针lastNode表示当前节点的上一个节点。

访问节点3的时候,lastNode为右子树的根(节点5),代表右子树已经访问完了,则就可以访问该节点了。

非递归(迭代)实现:



4.总结:

  • 前序遍历、中序遍历、后序遍历的递归实现很简单,但是非递归迭代实现就有稍微有点难理解了。
  • 用了同一种思路,把树分为左路节点和左路节点的右子树,针对这三种遍历方式都适用。
  • 从根本上就是用循环模拟递归的过程。
  • 后序遍历相对前序和中序又稍微复杂,要考虑好访问节点的条件,避免死循环。
  • 多画图模拟迭代的过程更容易理解。

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

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

相关文章

基于python上门维修预约服务数据分析系统

目录 技术栈和环境说明解决的思路具体实现截图python语言框架介绍技术路线性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求,本系统采用运用较为广…

一、机器学习算法与实践_03概率论与贝叶斯算法笔记

1、概率论基础知识介绍 人工智能项目本质上是一个统计学项目,是通过对 样本 的分析,来评估/估计 总体 的情况,与数学知识相关联 高等数学 ——> 模型优化 概率论与数理统计 ——> 建模思想 线性代数 ——> 高性能计算 在机器学…

Qt窗口——对话框

文章目录 对话框自定义对话框对话框分类消息对话框QMessageBox使用示例自定义按钮快速构造对话框 颜色对话框QColorDialog文件对话框QFileDialog字体对话框QFontDialog输入对话框QInputDialog 对话框 对话框可以理解成一个弹窗,用于短期任务或者简洁的用户交互 Qt…

AIoT智能工控板

在当今竞争激烈的商业环境中,企业需要强大的科技力量来助力腾飞,AIoT智能工控板就是这样的力量源泉。 其领先的芯片架构设计,使得主板的性能得到了极大的提升。无论是数据的处理速度、图形的渲染能力,还是多任务的并行处理能力&a…

【Linux笔记】虚拟机内Linux内容复制到宿主机的Window文件夹(文件)中

一、共享文件夹 I、Windows宿主机上创建一个文件夹 目录:D:\Centos_iso\shared_files II、在VMware中设置共享文件夹 1、打开VMware Workstation 2、选择需要设置的Linux虚拟机,点击“编辑虚拟机设置”。 3、在“选项”标签页中,选择“共…

【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析

2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析 更新进展 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用…

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染,又能做单页应用的框架,如果想做单页应用,又想学服务端渲染,使用Remix可以降低学习成本。最近,在学习Remix的过程中,遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…

简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题

309. 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含冷冻期 分析: 使用动态规划解决 状态表示: 由于有「买入」「可交易」「冷冻期」三个状态,因此我们可以选择用三个数组,其中: ▪ dp[i][0] 表示:第 i 天结束后&#xff0c…

探索AI编程新时代:GitHub Copilot如何重塑开发者工作效率

在当今技术瞬息万变的时代,软件开发者们每天都在努力寻找更高效的编程方法。面对繁忙的工作日程和不断增加的项目压力,如何在编码过程中大幅提升效率成为了一个备受关注的话题。在众多工具中,GitHub Copilot以其强大的AI驱动能力脱颖而出&…

菜鸟也能轻松上手的Java环境配置方法

初学者学习Java这么编程语言,第一个难题往往是Java环境的配置,今天与大家详细地聊一聊,以便大家能独立完成配置方法和过程。 首先,找到“JDK”,点击“archive”: 向下滑,在“previous java rel…

HTTPS:构建安全通信的基石

HTTPS(Hypertext Transfer Protocol Secure),作为互联网上安全通信的基石,通过在HTTP基础上引入SSL/TLS协议层,实现了数据传输的加密,确保了信息的机密性、完整性和真实性。这一过程涉及多个精细设计的步骤…

【EasyBlog】基于React+AntD+NextJS+NestJS+MySQL打造的开源博客系统

Github项目地址:https://github.com/fecommunity/easy-blog, 欢迎Star。 Easy-Blog Easy-Blog 是一套集成文章发表、页面创建、知识库管理、博客后台管理等功能于一体的博客系统。 首页-浅色主题 首页-暗黑主题 文章阅读 后台管理 ✨ 特性 &#…

公司网站改版时,需要注意哪些细节?

在公司网站改版时,需要注意的细节非常多,这些细节将直接影响到网站的用户体验、SEO效果以及整体品牌形象。以下是一些关键的注意事项: 明确改版目标: 在改版前,要明确改版的目标是什么,比如提升用户体验、增…

【AcWing】873. 欧拉函数

#include<iostream> using namespace std;int main(){int n;cin>>n;while(n--){int x;cin>>x;int resx;for(int i2;i<x/i;i){if(x%i0){//resres*(1-1/i);整数1/i等于0&#xff0c;算不对且会溢出//以下几种都能ac//resres/i*(i-1);i*(1-1/i)i-1&#xff0…

通过标签实现有序:优化你的 FastAPI 生成的 TypeScript 客户端

在软件开发的世界里&#xff0c;API 客户端代码的质量直接影响着应用程序的性能和可维护性。随着项目规模的扩大&#xff0c;自动化生成的代码往往变得臃肿且难以管理。但幸运的是&#xff0c;通过一系列的优化策略&#xff0c;我们可以显著提升这些代码的优雅与效能。在本文中…

计算机网络(八) —— Udp协议

目录 一&#xff0c;再谈端口号 1.1 端口号 1.2 netsta命令 二&#xff0c;UDP协议 2.1 关于UDP 2.2 Udp协议格式 2.3 Udp协议特点 2.4 Udp的缓冲区 一&#xff0c;再谈端口号 http协议本质是“请求 - 响应”形式的协议&#xff0c;但是应用层需要先将数据交给传输层&…

2024/9/21 408 20题

a b 58-130-180-199-42-15&#xff1a;c d a 184-182-187-176-19941 c d a a c b d c a c b c c c

12V转100V低压升高压DC/DC电源GRB12-100D-100mA-Uz(0-3V)

特点 ● 效率高达75%以上 ● 1*2英寸标准封装 ● 单电压输出 ● 超高性价比 ● 电压控制输出,输出电压随控制电压的变化而线性变压 ● 工作温度: -40℃~75℃ ● 阻燃封装&#xff0c;满足UL94-V0 要求 ● 温度特性好 ● 可直接焊在PCB 上 应用 GRB 系列模块电源是一…

深度学习笔记17_TensorFlow实现咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

linux操作系统的基本命令

1.linux下的文件系统 在linux操作目录下没有像window操作系统下盘符的概念,只有一个根目录/,所有文件目录都在它的下面 linux的目录结构: 在Linux系统中: 文件都从跟目录开始的,用/表示文件名称区分大小写路径都是以/俩进行分隔(windown用\分隔)以.开头的文件为隐藏文件 Li…