(第30天)二叉树阶段总结

目录

  • 1.判断二叉树是否对称或相同
    • 统一思路
    • 遍历顺序
    • 递归和迭代
  • 2.求二叉树的最大深度
    • 题目解读
    • 递归法逻辑
    • 迭代法逻辑
  • 3.求二叉树的最小深度
    • 题目解读
    • 递归法逻辑
    • 遍历法逻辑
  • 4.求二叉树的节点数
    • 递归法
    • 迭代法
  • 5.判断二叉树是否是平衡二叉树
    • 题目解读
    • 递归法
    • 迭代法
  • 6.求二叉树的所有路径
    • 递归法
    • 迭代法
  • 总结

1.判断二叉树是否对称或相同

统一思路

  • 成对的比较树的节点
  • 判断对称时,成对地比较外侧节点。
  • 判断相同时,成对地比较同侧地节点。

遍历顺序

  • 判断对称时,左子树遍历顺序为左右中,右子树遍历顺序为右左中。
  • 判断相同时,左右树遍历顺序相同,都为左右中。

递归和迭代

  • 递归法:再递归函数中编写判断逻辑,每次递归都要判断当前子树是否对称或相同。
  • 迭代法:使用容器,每次存储一对要比较的节点,取出节点比较的同时,把这两个节点的子节点成对地存储进容器中。

2.求二叉树的最大深度

题目解读

求二叉树的最大深度就是求根节点的最大高度,也就是求离根节点距离最远的叶子节点的距离。

递归法逻辑

  • 使用前序遍历来遍历整棵树:中左右
  • 当节点的左右子节点都为空时,表明到达了叶子节点,执行返回操作
  • 深度的记录:使用result变量记录整棵树的最大深度,用depth记录递归过程中的深度变化;只有当depth变化到大于result的时候再改变result的值。

迭代法逻辑

  • 使用层序遍历来遍历整棵树
  • 进行每一层遍历的时候深度depth加一,最终的depth的值就是二叉树的最大深度。

3.求二叉树的最小深度

题目解读

求二叉树的最小深度,就是求离根节点最近的叶子节点的距离。

递归法逻辑

  • 总思路:二叉树的最小深度 = 根节点深度1 + 左右子树中的最小深度
  • 用后序遍历来遍历整棵树:左右中
  • 求深度的逻辑:
  1. 如果当前节点为空,则不增加深度,返回0;
  2. 如果当前节点有左子节点无右子节点,则以当前节点为根节点的子树最小深度 = 当前节点深度1 + 左子树最小高度
  3. 如果当前节点有右子节点无左子节点,则以当前节点为根节点的子树最小深度 = 当前节点深度1 + 右子树最小高度
  4. 如果当前节点有左子节点和右子节点,则以当前节点为根节点的子树的最小深度 = 当前节点深度1 + min(左子树高度, 右子树高度)

遍历法逻辑

  • 使用层序遍历
  • 每遍历一层节点,深度加一
  • 如果遇到有节点无左右子节点,直接将当前深度返回,当前深度就是二叉树的最小深度

4.求二叉树的节点数

递归法

  • 使用前中后序遍历皆可。
  • 当前节点为空时,代表没有遍历到新节点,返回0。
  • 当前节点不为空时,代表遍历到了新节点,就可以把当前节点计入二叉树节点数,节点数+1。(也就是每次遍历到新的节点的时候,把节点数加1)
  • 针对不同的遍历方式,设置不同的递归逻辑。

迭代法

  • 以层序遍历解决。(深度优先遍历也可以)
  • 在遍历的过程中,每遍历一层时,得出这一层的节点个数,然后将每一层的节点个数加在一起。

5.判断二叉树是否是平衡二叉树

题目解读

要判断二叉树是否为平衡二叉树,重点在于判断每一个节点的左子树高度和右子树高度的差的绝对值不大于1

递归法

  • 根据题目解读,来设计一个可以求出以当前节点为根节点的二叉树的高度的递归函数。在递归函数内求出左子树和右子树的高度,并计算它们高度差的绝对值。
  • 递归逻辑:
  1. 如果当前节点为空,代表二叉树高度为0,返回0;
  2. 后序遍历,左右中:先求左子树的高度,再求右子树的高度,再处理中间节点。
  3. 处理中间节点:每次递归完成,以中间节点为根节点的二叉树高度 = 中间节点1 + max(左子树高度,右子树高度),再将这个高度返回。
    ps:二叉树的高度 = 根节点1 + 左右子树中的最大高度

迭代法

  • 设计一个函数,可以求出以参数cur节点为根节点的子树的高度。
  • 主函数:用栈模拟后序遍历,每遍历到一个节点,算出它的左子树高度和右子树高度,并把它们的高度差和1作比较,如果大于1,则表明这个树不是平衡二叉树,返回false;否则,返回true。

6.求二叉树的所有路径

递归法

  • 重要参数选择说明:path用来存储遍历过程中的一条路径、result用来存储二叉树中所有合法的路径
  • 递归逻辑:使用任意一种深度优先遍历技术对二叉树进行遍历(这里用前序遍历)
  • 每遍历完一条完整的路径,也就是遇到叶子节点,就遍历path中的值,转换成路径的表达方式加到result
  • 递归过程中的回溯:每次递归结束,从上一个节点返回,path中保存的上一个节点也应弹出,这是一次显性的回溯操作(事实上,只要有递归就有回溯)。
  • 递归函数功能说明:遍历整个二叉树,并把所有合法的路径加入结果集中。

迭代法

  • 使用一个栈st1模拟递归来遍历二叉树,使用另一个栈st2来存储遍历过程中的所有路径。
  • 当遇到叶子节点的时候st2栈顶存储的路径就是一条完整的合法路径。
  • 每当从st1栈中取出一个节点遍历的时候,总从st2中取出对应的路径来进行回溯操作。
  • 如果取出的这个节点是叶子节点,就把取出的相应的路径加入结果集。

总结

  1. 深度和高度
  • 节点深度:根节点到当前节点的节点个数
  • 节点高度:叶子节点到当前节点的节点个数
  • 二叉树的最大深度:根节点到离它最远的叶子节点的节点个数,其实就是二叉树的高度
  • 二叉树的最小深度:根节点到离它最近的叶子节点的节点个数
  • “求深度和高度的题目” ==> “求最小深度和最大深度(高度)的题目”,题目中让求二叉树(最大/小)深度的问题完全可以转化为求(特定)高度的问题,都可以用遍历的方法加上条件判断语句解决。
  • 有用的概念节点深度、二叉树高度、二叉树最大深度、二叉树最大高度 节点高度(除外)
  1. 遍历技术如何求深度和高度
  • 层序遍历:遍历过程中,每遍历一层,当前节点深度加一,已知二叉树高度加一。(节点的高度再题目中好像并没有多少实际意义)
  • DFS:每向子节点前进一次,相应的节点深度和已知二叉树高度加一、回退时相应深度减一
  1. DFS的实现
  1. 递归实现:参数、返回值、终止条件、递归逻辑(前中后)的设计,再题目中使用时往往要注意中间节点代码处理的逻辑
  2. 迭代实现:借用栈,根据遍历顺序的不同来编写把节点压入和取出栈的逻辑。先要压入栈,然后从栈中取出才能加入结果集,把节点从栈中取出加入结果集的同时把节点的子节点按照顺序压入栈中。
  1. BFS的实现
  1. 递归实现:给递归函数设计一个深度参数,再递归过程中,根据深度参数来把节点放入指定的层数;结果集是一个二维数组,二维数组的每一行代表一层。(可见递归函数中参数设计的重要性)
  2. 迭代实现:借用队列实现,先把节点加入队列,然后从队列取出放入结果集,同时,把这个节点的子节点从左到右的加入队列。
  1. 递归函数的设计

递归函数设计的重中之重是:先明确递归函数的功能然后去实现递归三部曲.

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

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

相关文章

OPenCV的重要结构体Mat

一 Mat Mat是什么? Mat有什么好处? class CV_EXPORTS Mat{ public: ... int dims;//维数 int rows,cols;//行列数 uchar *data;//存储数据的指针 int *refcount;//引用计数 ...};二 Mat属性 三 Mat拷贝 1 Mat浅拷贝 Mat A Aimread(file,IMREAD_COLOR) …

【TensorFlow深度学习】状态值函数Vπ与最优策略π∗的求解方法

状态值函数Vπ与最优策略π∗的求解方法 状态值函数Vπ与最优策略π*的求解方法:强化学习中的寻宝图鉴理论基础求解方法代码示例:Value Iteration代码示例:Policy Iteration结语 状态值函数Vπ与最优策略π*的求解方法:强化学习中…

http接口上传文件响应413:413 Request Entity Too Large

目录 一、场景简介二、异常展示三、原因四、解决 一、场景简介 1、服务端有经过nginx代理 2、上传文件超过5M时,响应码为413 3、上传文件小于5M时,上传正常 二、异常展示 三、原因 nginx限制了上传数据的大小 四、解决 扩大nginx上传数据的大小 步…

Linux之文件打包,压缩,解压

打包和压缩 Linux中对文件进行打包,压缩有两种命令 zip:将文件进行压缩 tar:将文件进行打包(通过和其他命令结合,也能实现压缩的功能) 1、tar打包命令 在Linux中,tar命令是一个常用的工具,用于打包和解…

Web前端的工作内容:深度解析与探索

Web前端的工作内容:深度解析与探索 Web前端,作为互联网世界中用户与网站之间的桥梁,承载着丰富的交互体验和视觉呈现。其工作内容涉及多个层面,从基础的页面构建到复杂的交互设计,都需要前端开发者精心打磨。下面&…

【详细的Kylin使用心得,什么是Kylin?】

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

Qwen2-MOE-57B-A14B模型结构解读

Qwen2-MOE-57B-A14B模型结构解读 模型代码文件下载 该模型总的参数为57B&#xff0c;激活参数为14B&#xff0c;推理速度比32B的快&#xff0c;而且性能更好。 Qwen2-MOE-57B-A14B模型总体结构 <class transformers.models.qwen2_moe.modeling_qwen2_moe.Qwen2MoeForCaus…

秋招突击——算法打卡——6/5——提高{(状态机模型)股票买卖、(单调队列优化DP)最大子序列和}——新做:{考试的最大困扰度}

文章目录 提高(状态机模型)股票买卖IV思路分析实现代码参考代码 新作考试的最大困扰度个人实现参考思路 总结 提高 (状态机模型)股票买卖IV 上一次的思路总结&#xff0c;上次写的时候忘记总结了&#xff0c;现在重新画一下图 思路分析 这道题是一个经典的状态机模型&#…

用动态IP采集数据总是掉线是为什么?该怎么解决?

动态IP可以说是做爬虫、采集数据、搜集热门商品信息中必备的代理工具&#xff0c;但在爬虫的使用中&#xff0c;总是会遇到动态IP掉线的情况&#xff0c;从而影响使用效率&#xff0c;本文将探讨动态IP代理掉线的几种常见原因&#xff0c;并提供解决方法&#xff0c;以帮助大家…

牛客网刷题 | BC119 最高分与最低分之差

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输入n个成绩&#…

CleanMyMac2025破解版crack+keygen

【CleanMyMac】这款神奇的软件&#xff0c;让我彻底告别了电脑卡顿的困扰&#xff01;&#x1f62e;‍&#x1f4a8; CleanMyMac绿色免费版下载如下&#xff1a;记得保存哈&#xff0c;以防失效&#xff1a; https://pan.quark.cn/s/9b08114cf404 CleanMyMac X2024全新版下载…

【JavaScript】了解 Sass:现代 CSS 的强大预处理器

我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 &#x1f3b5; 牛奶咖啡《从你的全世界路过》 在前端开发领域&#xff0c;CSS 是必不可少的样式表语言。然而&#xff0c;随着项目复杂度的…

指针(初阶2)“野指针以及指针运算”

目录 一.野指针 二.如何避免野指针 三.指针运算 1、指针&#xff08;-&#xff09;整数 2、指针 - 指针 3、指针关系运算 小编在这里声明一下&#xff0c;将某一块的知识点分为上中下或者1&#xff0c;2&#xff0c;3来编写不是为了增加小编的文章总量&#xff0c;也不是故意这…

爬虫实现思路

现在的人工智能太强大了&#xff0c;只要有问题&#xff0c;输入后就能给出大致的实现思路&#xff1b;我看了下确实没问题&#xff0c;只需要更改一些细节基本就能拿来就用&#xff1b;下面是我实验经历&#xff1a; 问题&#xff1a; c# 书写爬虫爬取按动物名称&#xff0c;…

279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计

基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计。计算出满足功率因素、电压不平衡度等电能指标的条件下。RPC所需要的补偿功率。求得所需最小的系统客量。该设计能快速计算出符合系统设定指标的各项最优补偿功率。并通过sumulink份真。检验设计参数的准确性。…

泛微开发修炼之旅--13通过Ecology拦截器(注解的方式),拦截后端接口,实现接口执行成功后或执行前操作源码示例

文章链接&#xff1a;泛微开发修炼之旅--13通过Ecology拦截器(注解的方式)&#xff0c;拦截后端接口&#xff0c;实现接口执行成功后或执行前操作源码示例

R语言探索与分析20-北京市气温预测分析

一、序言 近年来&#xff0c;人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放&#xff0c;大量温室气体强烈吸收地面辐射中的红外线&#xff0c;造 成温室效应不断累积&#xff0c;使得地球温度上升&#xff0c;造成全球气候变暖。气象温度的预测一直以来都是天气预…

C语言详解(结构体)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

网关API(SpringCloudGateway)如何自定义Filter

1.前言 SpringCloud 虽然给我们提供了很多过滤器&#xff0c;但是这些过滤器功能都是固定的&#xff0c;无法满足用户的各式各样的需求。因此SpringCloud提供了过滤器的扩展功能自定过滤器。 开发者可以根据自己的业务需求自定义过滤器。 2. 自定义 GatewayFilter(局部过滤器)…

2024.6.9刷题记录

目录 一、1103. 分糖果 II 1.模拟 2.数学 二、312. 戳气球 1.递归-记忆化搜索 2.区间dp 三、2. 两数相加 1.迭代 2.递归-新建节点 3.递归-原节点 四、4. 寻找两个正序数组的中位数 1.堆 2.双指针二分 五、5. 最长回文子串 1.动态规划 2.中心扩展算法 六、6. Z…