代码随想录算法训练营第十三天

news2024/9/20 21:41:16

day12周日放假

二叉树理论基础:

文章链接:代码随想录

文章摘要:

满二叉树定义:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

完全二叉树定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。

看完有人可能会有点懵(讲的有点难理解),下面是图例

二叉搜索树定义

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉搜索树

二叉搜索树是一个有序树。

平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

如图(注意:以下均为二叉搜索树,但有的不是平衡二叉搜索树)

二叉树的定义写法 : 

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

力扣题部分:

144.二叉树的前序遍历

题目链接:. - 力扣(LeetCode)

题面:

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

思路(递归法):

写好一个递归需要三步:

确定递归函数的参数和返回值:因为要打印出前序遍历节点的数值,所以参数里需要传入vector来放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,所以递归函数返回类型就是void。

确定终止条件:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就直接return

确定单层递归的逻辑:前序遍历是中左右的顺序,所以在单层递归的逻辑,是要先取中节点的数值

代码实现:

思路(迭代法):

        通过栈来访问树,不断把根节点放入栈里然后往左延伸,直到左子树没有了之后慢慢回弹访问右节点,前序遍历在第一次访问时就可以放进数组里了。

代码实现:

94.二叉树的中序遍历

题目链接:. - 力扣(LeetCode)

题面:

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

思路(递归法):

        基本同前序遍历,不同的是——前序遍历是中左右的顺序,中序遍历是左中右的顺序

代码实现:

思路(迭代法):

        基本同前序遍历。改动了输出的位置,第二次访问(也就是出栈时)输入进数组

代码实现:

145.二叉树的后序遍历

题目链接:. - 力扣(LeetCode)

题面:

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

思路(递归法):

        基本同前序遍历,不同的是——前序遍历是中左右的顺序,后序遍历是左右中的顺序

代码实现:

思路(迭代法):

        比前两次麻烦,因为按这样的模式遍历,第三次遍历时才能输出,为了确认出栈时是第三次而不是第二次,需要一个unordered_map记录了。

代码实现:

层序遍历合集(我要打十个!)

  • 102.二叉树的层序遍历(opens new window)
  • 107.二叉树的层次遍历II(opens new window)
  • 199.二叉树的右视图(opens new window)
  • 637.二叉树的层平均值(opens new window)
  • 429.N叉树的层序遍历(opens new window)
  • 515.在每个树行中找最大值(opens new window)
  • 116.填充每个节点的下一个右侧节点指针(opens new window)
  • 117.填充每个节点的下一个右侧节点指针II(opens new window)
  • 104.二叉树的最大深度(opens new window)
  • 111.二叉树的最小深度(opens new window)

被这么多题吓到了?

其实这些题的ac代码和第一道题不同的只有几行,这也正是十道题一口气放出来的原因。

102.二叉树的层序遍历(题目为可点链接)

思路:

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上

先将第一层(也就是根节点)压到队列内,计算size(第一层有个节点,size = 1)然后开始第一层的for循环,然后将当前层不为空的左右节点放进队列,由于我们早就记录了size,不用担心这一层的数据读完后直接开始读下一层导致的混乱,每层for循环里会把记录的数据放进数组vec里,结束后放进result内,然后重新定义vec继续记录下一行,直到当前层一个节点都没有,然后退出循环。

(注意:一定只能先把size计算出来,for循环内会改变q.size(),不能将结束条件直接跟q.size()挂钩)

代码实现: 

107.二叉树的层次遍历II(题目为可点链接)

思路:

        没啥好说的,最后反转一下就好了。

代码实现:

199.二叉树的右视图(题目为可点链接)

思路: 

        也没啥好说的,只需要记录每层末尾就行了

代码实现: 

637.二叉树的层平均值(题目为可点链接)

思路:

        没啥好说的+1,记得数据改double就行

代码实现:

429.N叉树的层序遍历(题目为可点链接)

思路:

        由于树是N叉树,所以在将当前节点子树压入队列是需要调整代码,用一个for循环搞定即可

代码实现:

515.在每个树行中找最大值(题目为可点链接)

思路:

        和右视图如出一辙,一个找最右边,一个找最大。

代码实现:

116.填充每个节点的下一个右侧节点指针(题目为可点链接)

思路:

        遍历每层时遍历到非当前层最后一个元素时(也就是当i != size - 1时),为遍历到的元素找层序遍历的下一个(也就是q.pop()完后的q.front()),理解层序遍历的本质,这道题也就是按着思路稍微改改而已。

代码实现:

​​​​​​​117.填充每个节点的下一个右侧节点指针II(题目为可点链接)​​​​​​

思路:  

        乍一看感觉和上一道题思路一模一样也没啥问题。然而......事实就是这样 ╮( ̄▽ ̄")╭

因为层序遍历的模式可以不需要考虑所给的树是否为完全二叉树。 

代码实现:

​​​​​​​

104.二叉树的最大深度(题目为可点链接)

思路:

        加个计数器,每遍历一层加一就好了。

代码实现:

​​​​​​​

111.二叉树的最小深度(题目为可点链接)

思路:

        和上面也就差一行:当遍历到叶子节点直接return high + 1;(每层遍历完后high才会+1,由于当前层没有遍历完我们就直接return了,所以不能return high,而是要return high + 1。)

代码实现:

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

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

相关文章

springboot限流验证码登录接口(优雅版)

我们的业务逻辑是如图所示, 限流思路 我们 实现登录接口之后,我们想像这么一个场景,因为我们的登录接口在我们的拦截器中是放行的,如果这时候有人恶意来爆刷我们的登录接口,那我们的这个接口不就爆掉了吗&#xff0c…

【车载开发系列】使用J-Flash下载Hex文件

【车载开发系列】使用J-Flash下载Hex文件 【车载开发系列】使用J-Flash下载Hex文件 【车载开发系列】使用J-Flash下载Hex文件概要1. 打开J-Flash软件2. 创建新的工程3. 选择芯片类型4. 打开HEX文件5. 连接芯片6. 擦除目标扇区(可选)7. 烧写文件到目标扇区…

计算机毕业设计PySpark+Django农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop

本科生毕业实习与设计(论文) 基于协同过滤的农产品推荐系统 Agricultural products recommendation system based on Collaborative filtering 学 院: 机械工程学院(楷体_GB2312四号,下同) …

pdf怎么转换成word?介绍6个pdf转word免费方法!(超简单)

pdf怎么转换成word?pdf格式因兼容多种平台和操作系统而广受欢迎,非常适合文档存储和共享。然而,编辑 PDF 文件通常需要试用一些其它的软件进行辅助,这让许多用户选择将 PDF 转换为 Word 格式,以方便内容修改。在以下情…

《Kotlin核心编程》2021版复习记录

目录 0 前言1 基础语法1.1 数据类型1.2 数组1.3 集合1.4 遍历数据和集合1.5 函数声明返回值类型1.6 var 和 val 2 高阶函数和lambda表达式2.1 高阶函数2.2 方法和成员引用2.3 链式调用2.4 扩展函数2.5 面向表达式编程2.5.1 when表达式2.5.2 for循环2.5.3 in 2.6 字符串相等 3 面…

【nginx 第一篇章】认识一下 NGINX 服务器

一、简介 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。由俄罗斯程序员 Igor Sysoev 开发,并在2004年首次公开发布。Nginx 以其高并发处理能力、低内存消耗、稳定性、丰富的功能集、简单的配置以及低学…

硬件面试经典 100 题(31~50 题)

31、多级放大电路的级间耦合方式有哪几种?哪种耦合方式的电路零点偏移最严重?哪种耦合方式可以实现阻抗变换? 有三种耦合方式:直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重,变压器耦合的电路可以实现…

嘉立创eda泪滴

泪滴https://prodocs.lceda.cn/cn/pcb/tools-teardrop/

【1】设计模式简介

一.什么是设计模式 每一个模式描述了一个在我们周围不断重复发生的问题以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。 二.深入理解面向对象 向下:深入理解三大面向对象机制 封装,隐藏内部实现继承&am…

Linux SystemV(共享内存(*)、消息队列、信号量)

个人主页:仍有未知等待探索-CSDN博客 专题分栏: Linux 目录 ​编辑 一、共享内存 1、原理 理解: 2、操作具体理解 1.概括 2.创建共享内存 共享内存的生命周期? key是什么? 进程怎么知道,共享内存是…

使用 FlexboxLayout 实现灵活布局

在 Android 开发中,有时我们需要让子视图根据内容和可用空间灵活排列。这时候,FlexboxLayout 是一个非常强大的工具,它类似于 CSS 中的 flexbox,允许我们轻松创建响应式布局。在这篇博客中,我们将详细介绍如何在 Andro…

原创度检测工具,快速检测文章原创值

原创度检测工具是帮助我们快速了解文章质量的工具,它能以最短的时间帮助我们了解到一篇文章的原创值是多少,并且还能帮助我们分析文章中哪些内容质量高,哪些内容质量低,从而对低质量的内容进行修改,达到提升整篇文章质…

Android App开发教学: 利用MediaPipe实现即时脸部侦测功能

前言 在Android开发中,实现即时脸部侦测功能是一个具有挑战性且引人注目的任务。幸运的是,Google的MediaPipe库为我们提供了一个简单且高效的解决方案。MediaPipe是一个开源的跨平台机器学习框架,可以用于各种视觉计算任务,包括脸…

C#泛型委托,约束

一、泛型委托 泛型的委托有很多&#xff0c;但掌握常见的泛型委托应用即可 委托可以定义它自己的类型参数。 引用泛型委托的代码可以指定类型参数以创建封闭式构造类型。 public delegate void Del<T>(T t);//Del<T> 是一个泛型委托 public static void Notify…

音频剪辑怎么剪?这4种裁剪方法快学起来

无论是音乐创作、播客录制还是专业的声音设计&#xff0c;高质量的音频剪辑都是创造引人入胜作品的关键。 然而&#xff0c;对于初学者或是专业人士而言&#xff0c;找到合适的音频剪辑工具&#xff0c;并掌握其使用方法&#xff0c;是通往成功道路上的第一步。 那么&#xf…

Python数据库操作必备:事务隔离级别全解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据库操作中&#xff0c;事务隔离是保证数据一致性和并发控制的重要机制。事务隔离级别决定了一个事务可以看到其他事务的哪些更改&#xff0c;常见的隔离级别包括未提交读&#xff08;Read Uncommitted&…

Java海康门禁设备 对接人脸下发API

海康门禁机设备API接口对接 引言&#xff1a; 我本人在对接海康门禁机设备的时候遇到了两个 问题1&#xff1a;人脸下发失败的问题&#xff0c;是根据官方的Demo&#xff0c;遇到的问题&#xff0c;可以参考一下 这个问题我排查了很久&#xff0c;最终发现是海康给的Demo里面…

EasyX自学笔记3(割草游戏2)

在上一篇笔记之中我们还留有许多bug&#xff0c;如派蒙不会转头、派蒙是鬼没影子、斜向速度过快、会跑出界外的问题在此一并处理。 在上一章里我们知道需要玩家类、敌人类、子弹类三种&#xff0c;但是其包含的是他们的运行逻辑和变量。而播放动画帧也有许多函数我们也将其封装…

学习Java的日子 Day68 jQuery操作节点,Bootstrap

jQuery 1.jQuery操作DOM DOM为文档提供了一种结构化表示方法&#xff0c;通过该方法可以改变文档的内容和展示形式 在访问页面时&#xff0c;需要与页面中的元素进行交互式的操作。在操作中&#xff0c;元素的访问是最频繁、最常用的&#xff0c;主要包括对元素属性attr、内容…