中序遍历二叉树全过程图解
文章目录
- 中序遍历图解
- 总结
- 拓展:回归与回溯
中序遍历图解
首先看下中序遍历的代码,其接受一个根结点root
作为参数,判断根节点是否为nil
,不为nil
则先递归遍历左子树。
func traversal(root *TreeNode,res *[]int) {if root == nil {return}traversal(root.Left,res)*res = append(*res,root.Val)traversal(root.Right,res)
}
我们把树根结点A
传递给它,其左结点为B
,右结点为C
。
首先我们要检查root
是否为nil
,其不为nil
,通过递归继续遍历左边的子树,将左子树传递给递归函数,该层递归函数的root
为B
,其左子树为D
右子树为E
,判断root
是否为nil
,root
不为nil
,继续将该树的左子树向下递归,该层递归函数的root
为D
,左右子树都为nil
,我们检查root
是否为nil
,root
为D
,不为nil
,继续递归遍历D
的左子树,其左子树为nil
,所以该层递归函数的root
为nil
,满足递归结束条件,执行return退出该层递归函数
。
递
到此处时的运行栈如下图所示
此时的return
会回到root
为D
的递归层,D
的左子树已经遍历完毕,我们执行下一行语句append
,
该语句会将root
的数据域加入到结构列表res
中,即访问到了D
,如下图
按照顺序继续执行,接下来将使用递归遍历D
的右子树,这里D
的右子树为nil
,所以我们传入的递归参数也为nil
,检测到root
为nil
,我们退出该层递归函数,回到调用层D
,该层的所有语句都执行完毕了。我们继续回到调用它的函数,即B
层的 traversal(root.Left,res)
语句处
继续执行后序语句,执行 *res = append(*res,root.Val)
记录root
的数据域,即访问B
,再执行下一条语句
递归访问B
的右子树,将E
传递给它,判断root
是否为nil
,root
为E
,不为nil
,递归调用E
的左子树,左子树为nil
,判断root
是否为nil
,为nil
,退出该层
执行下一行,将E
记录到结果中,继续遍历E
的右子树,右子树为nil
,直接退出该层递归函数,返回到了E
的递归层,E
这层也执行完毕了,返回到调用它的B
层
随即B
层也执行完了,返回到调用它的A
层 ,在该层执行下一行代码,将A
记录到结果中,继续遍历A
的右子树,A
的右子树为C
,其不为nil
,递归C
的左子树F
,F
不为nil
,递归F
的左子树,F
的左子树为nil
,即传入的root
为nil
,满足递归结束条件,开始回归上层。
返回到调用它的F
层,将F
记录到结果中。遍历F
的右子树,F
的右子树也为nil
,退出该层,到此F
这层函数执行完毕,返回到调用F
的递归层 C
,下一行语句记录C
继续下一行语句,递归C
的右子树G
,判断该层递归的root
是否为nil
,当前root
为G
,不为nil
,递归G
的左子树,左子树为nil
,满足递归结束条件,返回到调用它的G
,输出G
,递归G
的右子树,右子树为nil
满足递归结束条件,返回到调用它的G
,G
这层函数结束,返回上层到C
C
也运行完毕,返回上层到A
,A
也运行完毕,此该树递归结束,这样我们就得到了中序遍历序列
总结
再次回顾一下代码
func traversal(root *TreeNode,res *[]int) {if root == nil {return}traversal(root.Left,res)*res = append(*res,root.Val)traversal(root.Right,res)
}
从我们的遍历全流程图解来看,不难理解,每个节点都是将其左子树全部递归遍历完后,才开始遍历其右子树的,如根节点A
,是将其左子树BDE
全部遍历完后,才开始遍历右子树的,注意思考递归栈哦,这样才能真正的理解。
中序遍历理解后,前序和后续遍历是一样的道理。这时一起看下后续遍历
的代码:
func traversal(root *TreeNode,res *[]int) {if root == nil {return}traversal(root.Left,res)traversal(root.Right,res)*res = append(*res,root.Val)
}
很多同学看到递归左右子树的那两行代码,很容易陷入误区,以为那两行是"同时"在执行,认为遍历完root的左节点后,立马遍历了其右节点,这种理解是非常不对的,实际是遍历完整个左子树后,经过
归
回到当前层,此时才会开始执行当前层的traversal(root.Right,res)
语句去遍历右子树。
尤其是看到两条回溯语句写在同一行时会更容易误解,如力扣104. 二叉树的最大深度
/*** definition for a binary tree node.* type treenode struct {* val int* left *treenode* right *treenode* }*/
func max (a, b int) int {if a > b {return a}return b
}// 递归
func maxdepth(root *treenode) int {if root == nil {return 0}return max(maxdepth(root.left), maxdepth(root.right)) + 1
}
实际最后一行代码是简化版,等价于如下代码
/*** definition for a binary tree node.* type treenode struct {* val int* left *treenode* right *treenode* }*/
func max (a, b int) int {if a > b {return a}return b
}// 递归
func maxdepth(root *treenode) int {if root == nil {return 0}leftDepth := maxdepth(root.left) // 递归左子树的深度rightDepth := maxdepth(root.right) // 递归右子树的深度return max(leftDepth,rightDepth ) + 1 // 当前根节点到叶子节点的最大深度
}
此时再看此代码是不是好理解一些 ,它就是我们的后序遍历
哇!将左子树全部遍历完后,才会开始遍历右子树,最后则是根节点,然后回到上层调用栈,直到所有接地那遍历完毕,递归函数执行完毕。
拓展:回归与回溯
这里就是一个简介,详细可见:LeetCode 257. 二叉树的所有路径(回溯详解)
前序遍历以及回溯的过程如图:
回溯和递归中回归的区别:
回溯
:因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。
回归
:下层函数栈执行完成后,回归到上层函数栈来实际上,回溯和回归都是伴随递归出现的,
只是回溯比回归多了一个路径回退的操作。
相关文章:

中序遍历二叉树全过程图解
文章目录 中序遍历图解总结拓展:回归与回溯 中序遍历图解 首先看下中序遍历的代码,其接受一个根结点root作为参数,判断根节点是否为nil,不为nil则先递归遍历左子树。 func traversal(root *TreeNode,res *[]int) {if root nil …...

设计模式 组合模式(Composite Pattern)
组合模式简绍 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样,可以在不知道对象具体类型的条…...

在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路
什么是vitepress vitepress是一种将markdown文件渲染成静态网页的技术 其使用仅需几行命令即可 //在根目录安装vitepress npm add -D vitepress //初始化vitepress,添加相关配置文件,选择主题,描述,框架等 npx vitepress init //…...

神经网络面试题目
1. 批规范化(Batch Normalization)的好处都有啥?、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是:A 解析: batch normalization 就…...

C语言题目之单身狗2
文章目录 一、题目二、思路三、代码实现 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况,而本道题是出现两个单身狗的情况。根据一个数…...
Vue2学习笔记(03关于VueComponent)
1.school组件本质是一个名为Vuecomponent的构造函数,且不是程序员定义的,是Vue.extend生成的。 2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new Vuecompo…...
微服务架构中常用技术框架
认证授权 Spring Security OAuth 2.0 JWT Keycloak Istio Apache Shiro 日志监控 ELK Prometheus Grafana Fluentd CI/CD Jenkins GitLab CI CircleCI ArgoCD 服务通信 gRPC REST API Apache Thrift Apache Avro Apache Dubbo OpenFegin 断路器 Hystr…...

[深度学习]Pytorch框架
1 深度学习简介 应用领域:语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年,chatGPT出现,进入AIGC发展阶段3 PyTorch框架简…...

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息
场景介绍 通知消息通过Push Kit通道直接下发,可在终端设备的通知中心、锁屏、横幅等展示,用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容,将通知消息分类为服务与通讯、资讯营销两大类别&…...

[Meachines] [Medium] Querier XLSM宏+MSSQL NTLM哈希窃取(xp_dirtree)+GPP凭据泄露
信息收集 IP AddressOpening Ports10.10.10.125TCP:135, 139, 445, 1433, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670, 49671 $ nmap -p- 10.10.10.125 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrp…...
新版ssh客户端无法连接旧版服务器sshd的方法
新安装完的windows 版本,连Linux服务器直接报错 C:\Users\wang>ssh root192.168.110.50 Unable to negotiate with 192.168.110.50 port 22: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1,kex…...

MyBatis操作数据库-XML实现
目录 1.MyBatis的简单介绍 2.MyBatis操作数据库的步骤 2.1 添加依赖 2.2 配置文件 2.3 写持久层代码 2.4 方法测试 3.MyBatis操作数据库(增删查改) 3.1 CRUD标签 3.2 参数传递 3.3 Insert-新增 3.4 Delete-删除 3.5 Update-修改 3.6 Select-查询(映射问题) 1.MyB…...

华为HarmonyOS地图服务 5 - 利用UI控件和手势进行地图交互
场景介绍 本章节将向您介绍如何使用地图的手势。 Map Kit提供了多种手势供用户与地图之间进行交互,如缩放、滚动、旋转和倾斜。这些手势默认开启,如果想要关闭某些手势,可以通过MapComponentController类提供的接口来控制手势的开关。 接口…...

解决DockerDesktop启动redis后采用PowerShell终端操作
如图: 在启动redis容器后,会计入以下界面 : 在进入执行界面后如图: 是否会觉得界面过于单调,于是想到使用PowerShell来操作。 步骤如下: 这样就能使用PowerShell愉快地敲命令了(颜值是第一生…...

react + antDesign封装图片预览组件(支持多张图片)
需求场景:最近在开发后台系统时经常遇到图片预览问题,如果一个一个的引用antDesign的图片预览组件就有点繁琐了,于是在antDesign图片预览组件的基础上二次封装了一下,避免重复无用代码的出现 效果 公共预览组件代码 import React…...
逻辑回归 和 支持向量机(SVM)比较
为了更好地理解为什么在二分类问题中使用 SVM,逻辑回归的区别,我们需要深入了解这两种算法的区别、优势、劣势,以及它们适用于不同场景的原因。 逻辑回归和 SVM 的比较 1. 模型的核心思想 • 逻辑回归: • 基于概率的模型&…...

GS-SLAM论文阅读笔记--TAMBRIDGE
前言 本文提出了一个自己的分类方法,传统的视觉SLAM通常使用以帧为中心的跟踪方法,但是3DGS作为一种高效的地图表达方法好像更侧重于地图的创建。这两种方法都有各自的优缺点,但是如果能取长补短,互相结合,那么就会是…...
[Redis面试高频] - zset的底层数据结构
文章目录 [Redis面试高频] - zset的底层数据结构一、引言二、zset 的底层数据结构1、zset 的编码方式1.1、ziplist 编码1.2、skiplist 编码 1.3、ziplist 编码适用条件1.4、skiplist 编码适用条件2、zset 的操作命令 三、zset 的性能考量1、内存效率2、搜索效率 四、总结 [Redi…...
搜维尔科技:OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作
OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作 搜维尔科技:OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作...

CentOS Linux教程(6)--CentOS目录
文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑),然后C盘、D盘。 Linux系统的根目录是/,我们可以使用cd /进入根目录,然后使…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...