
二叉树
文章平均质量分 93
二叉树经典题目
百里守约学编程
你会的越多,不会的越多。
展开
-
二叉树:总结篇!【需要掌握的二叉树技能都在这里啦】
不知不觉二叉树专题已经刷了30多道经典题目。在每一道二叉树的题目中,我们都使用了递归三部曲1. 返回值、参数是什么?2. 终止条件是什么?3. 单层逻辑是什么?下面我们把分析过的题目分门别类,可以帮助大家循序渐进学习二叉树,也方便快速复习,看到一个标题,就回想一下对应的解题思路,这样很快就可以系统性的复习一遍二叉树了。文章的顺序,实际就是循序渐进的,所以如下分类基本就是按照文章发文顺序来的,我再做一个系统性的分类。原创 2024-10-01 15:50:57 · 1206 阅读 · 0 评论 -
二叉树理论基础
刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。Val int大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。这里要提醒大家要注意二叉树节点定义的书写方式。在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。因为我们在刷leetcode。原创 2024-09-17 21:39:53 · 901 阅读 · 0 评论 -
什么是递归
递归就像我们查字典的时候,当查找一个词时,发现它的解释中某个词仍然不懂,于是开始查这第二个词。就像在字典中一直查找不明白的词语 的情况。函数的调用,所以这个函数就是递归函数,一词不懂,于是开始查找千钧的意思。层时有多少种跳法,可以看作求解问题。到此我们就彻底明白了千钧一发的意思。自上而下的思考,也就是说如果要跳到。的问题解决了,无法继续往下递了。级台阶的跳法,那么从以上分析可得。这个词还是不懂,于是继续查找。仔细看题目,一只青蛙一次只能跳。级台阶有两种跳法,每次跳。函数我们简写下,改为。原创 2024-09-21 14:05:49 · 1712 阅读 · 0 评论 -
二叉树的前中后序遍历(递归法)( 含leetcode上三道【前中后序】遍历题目)
这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都靠运气。本篇将介绍前后中序的递归写法,一些同学可能会感觉很简单,其实不然,。: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么,进而确定递归函数的返回类型。确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,。原创 2024-09-17 22:28:06 · 1015 阅读 · 0 评论 -
中序遍历二叉树全过程图解
再次回顾一下代码从我们的遍历全流程图解来看,不难理解,每个节点都是将其左子树全部递归遍历完后,才开始遍历其右子树的,如根节点A,是将其左子树BDE全部遍历完后,才开始遍历右子树的,注意思考递归栈哦,这样才能真正的理解。中序遍历理解后,前序和后续遍历是一样的道理。这时一起看下后续遍历很多同学看到递归左右子树的那两行代码,很容易陷入误区,以为那两行是"同时"在执行,认为遍历完root的左节点后,立马遍历了其右节点,这种理解是非常不对的,实际是遍历完整个左子树后,经过归回到当前层,此时才会开始执行当前层的。原创 2024-09-21 19:16:45 · 2252 阅读 · 0 评论 -
通过两道题深入理解二叉树递归
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。如果当前节点不是叶节点,则继续访问他的子节点。题中所指的路径是从根节点出发到叶节点,也就是说路径总是以根节点为起始点,以叶子节点为终点,因此我们。纵观树的前、中、后序三种遍历方式中,只有前序遍历是首先访问根节点的,所以我们应选择。当用前序遍历的方式访问到某一节点时,我们把该节点添加到路径。给定一个二叉树,返回所有从根节点到叶子节点的路径。的值,如果该节点是叶子节点,且。原创 2024-09-20 22:42:52 · 666 阅读 · 0 评论 -
二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)
此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。这是因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进res数组中)可以同步处理,但是中序就无法做到同步!上面这句话,可能一些同学不太理解,建议自己亲手用迭代法,先写出来前序,再试试能不能写出中序,就能理解了。原创 2024-09-18 23:17:31 · 1056 阅读 · 0 评论 -
二叉树的层序遍历(含八道leetcode相关题目)
如图所示:将每层的元素从左至右加入队列,取出时就会先取出左节点,并将当前节点的左右节点又加入队尾,接着从队列取出下一个元素,将它的左右节点同样加入队尾,以此类推。那怎么确认取出多少个元素的时候可认为当前层的元素都取完了呢?这就需要一个变量来记录啦,这个变量其实就是每轮循环开始时队列的长度,当前长度就是当前层的所有元素,该轮循环的后续操作就是将下一层的所有节点加入队尾。层序遍历一个二叉树。这种遍历的方式和我们之前讲过的都不太一样。代码如下:这份代码也可以作为二叉树层序遍历的模板,打十个就靠它了。原创 2024-09-19 00:12:16 · 520 阅读 · 0 评论 -
N叉树的前序与后续遍历(含两道leetcode题)
在前序遍历中,我们会先遍历节点本身,然后从左向右依次先序遍历该每个以子节点为根的子树,而在后序遍历中,需要先从左到右依次遍历每个以子节点为根的子树,然后再访问根节点。此时我们可以利用前序遍历,只不过前序遍历中对子节点的遍历顺序是从左向右,而这里是从右向左。)出现在栈顶的位置。在遍历结束之后,我们把遍历结果进行反转,就可以得到后序遍历。,这样就保证了出栈顺序是从右向左,下一个遍历到的节点(即。叉树的前序遍历相同的方法,使用一个栈来得到后序遍历。为根节点的子树的遍历结果(不包括。,它的从左至右子节点依次为。原创 2024-09-22 13:25:55 · 1096 阅读 · 0 评论 -
257. 二叉树的所有路径(回溯详解)
综合以上,第二种递归的代码虽然精简但把很多重要的点隐藏在了代码细节里,第一种递归写法虽然代码多一些,但是把每一个逻辑处理都完整的展现出来了。来记录路径,注意在下面处理单层递归逻辑的时候,要做回溯,可能有的同学问了,我看有些人的代码也没有回溯啊。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。我们先使用递归的方式,来做前序遍历。,这么写的话相当于把递归和回溯拆开了, 一个在花括号里,一个在花括号外。这个回溯就有很大的问题,我们知道,回溯和递归是一一对应的,原创 2024-09-22 23:12:31 · 1429 阅读 · 0 评论 -
226. 翻转二叉树之多种解法(递归法、深度优先(迭代法)、广度优先【层序遍历】)
针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。这也是造成了二叉树的题目“一看就会,一写就废”的原因。针对翻转二叉树,我给出递归法、深度优先(迭代法)、广度优先【层序遍历】多种解法,都是之前我们讲过的写法,融汇贯通一下而已。大家一定也有自己的解法,但一定要成方法论,这样才能通用,才能举一反三!原创 2024-09-22 12:18:49 · 1282 阅读 · 1 评论 -
101. 对称二叉树(共含三道leetcode题)
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。在迭代法中我们使用了队列,需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素,知道这一本质之后就发现,用队列,用栈,甚至用数组,都是可以的。细心的话,其实可以发现,这个迭代法,其实是把左右两个子树要比较的元素顺序放进一个容器,然后成对成对的取出来进行比较,那么其实使用栈也是可以的。原创 2024-09-22 16:25:46 · 1637 阅读 · 0 评论 -
104. 二叉树的最大深度(包括N叉树的最大深度)
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求得根节点高度来求的二叉树最大深度。所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。是指从根节点到最远叶子节点的最长路径上的节点数。叉树,找到其最大深度。原创 2024-09-22 18:57:35 · 638 阅读 · 0 评论 -
111. 二叉树的最小深度
那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。以下讲解中,遍历顺序上依然采用后序遍历(因为要比较递归返回之后的结果,本文我也会给出前序遍历的写法)。,本题还可以使用层序遍历的方式来解决,思路是一样的。什么是叶子节点,左右孩子都为空的节点才是叶子节点!直觉上好像和求最大深度差不多,其实还是差不少的。如果左子树为空,右子树不为空,说明最小深度是。反之,右子树为空,左子树不为空,最小深度是。说明:叶子节点是指没有子节点的节点。1 + 左子树的深度。原创 2024-09-22 19:44:33 · 770 阅读 · 0 评论 -
110. 平衡二叉树
那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历。如果是求某个中间节点的深度,则使用后序遍历可能会算错,比如上图中节点4的深度是3,如果按后序遍历求高度来算,会得到深度是2(但深度实际是3,高度才是2)可以看出使用了前序(中左右)的遍历顺序,这才是真正求深度的逻辑!中求的是二叉树的最大深度,也用的是后序遍历。是指该树所有节点的左右子树的深度相差不超过。的题目中都是以节点为一度,即根节点深度是。中,如果真正求取二叉树的最大深度,,不同的地方有不一样的标准,原创 2024-09-22 22:22:10 · 999 阅读 · 0 评论 -
222. 完全二叉树的节点个数
网上基本都是这个精简的代码版本,其实不建议大家照着这个来写,代码确实精简,但隐藏了一些内容,连遍历的顺序都看不出来,所以初学者建议学习版本一的代码,稳稳的打基础。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。代码如下: 有没有看到青蛙跳台阶问题的影子,思想几乎一模一样好吧!:遍历树来统计节点是一种时间复杂度为。给你一棵 完全二叉树 的根节点。,算上了递归系统栈占用的空间。,求出该树的节点个数。,统计节点数量就可以了。原创 2024-09-22 21:37:03 · 693 阅读 · 0 评论 -
404. 左叶子之和
这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。此时就要通过节点的父节点来判断其左孩子是不是左叶子了。平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。希望通过这道题目,可以扩展大家对二叉树的解题思路。原创 2024-09-25 23:05:53 · 1234 阅读 · 0 评论 -
513. 找树左下角的值
递归求深度的写法,每进入一层,深度+1。递归中其实隐藏了回溯,上面递归代码时,故意让左右子树写法不同,左子树明确回溯,右子树隐藏了回溯。层次遍历本题涉及到的点,我们之前都讲解过,这些知识点需要同学们灵活运用,这样就举一反三了。原创 2024-09-25 23:42:06 · 1378 阅读 · 0 评论 -
112. 路径总和
类型表示,在回归的过程中,上层节点就可以继续往上回归告知再上一层节点,从我这里过的话存在满足条件的路径,知道一直回归告知给根节点,便可以知道整棵树存在满足条件的路径了。了,右子树都不用去递归了,但是不是发现精简之后的代码,已经完全看不出分析的过程了,所以我们要把题目分析清楚之后,再追求代码精简。图中可以看出,遍历的路线,并不要遍历整棵树,且需要上层节点能感知到经过自身节点的路径到达叶子节点后是否存在符合条件的路径,所以递归函数需要返回值,可以用。了,说明当前的路径符合要求,我们当前路径加入到。原创 2024-09-26 01:23:21 · 823 阅读 · 0 评论 -
106. 从中序与后序遍历序列构造二叉树
中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。首先后序数组的最后一个元素指定不能要了,这是切割点 也是 当前二叉树中间节点的元素,已经用了。后序数组没有明确的切割元素来进行左右切割,不像中序数组有明确的切割点,切割点左右分开就可以了。切割点在后序数组的最后一个元素,就是用这个元素来切割中序数组的,所以必须要先切割中序数组。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)而中序数组的右边界则是。原创 2024-09-28 00:54:02 · 1217 阅读 · 0 评论 -
889. 根据前序和后序遍历构造二叉树【二叉树】
前序遍历根节点是第一个节点,后续遍历根节点是最后一个节点。会是左子树的根节点,可以根据这个信息取后序列表中找到。如果存在多个答案,您可以返回其中 任何 一个。是同一棵树的后序遍历,重构并返回二叉树。注意列表空或者只有一个元素的时候就可以往上。,从而定位左右子树的元素区间。值的二叉树的前序遍历,比如例子中后序列表中找到。之后递归构建左右子树即可。原创 2024-10-16 23:12:43 · 395 阅读 · 0 评论 -
654. 最大二叉树
注意类似用数组构造二叉树的题目,每次分割尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。一些同学也会疑惑,什么时候递归函数前面加if,什么时候不加if,这个问题我在最后也给出了解释。如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。原创 2024-09-28 12:08:17 · 756 阅读 · 0 评论 -
617. 合并二叉树
合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。原创 2024-09-28 12:41:23 · 969 阅读 · 0 评论 -
700. 二叉搜索树中的搜索
本篇我们介绍了二叉搜索树的遍历方式,因为二叉搜索树的有序性,遍历的时候要比普通二叉树简单很多。但是一些同学很容易忽略二叉搜索树的特性,所以写出遍历的代码就未必真的简单了。所以针对二叉搜索树的题目,一样要利用其特性。文中我依然给出递归和迭代两种方式,可以看出写法都非常简单,就是利用了二叉搜索树有序的特点。原创 2024-09-28 13:22:31 · 817 阅读 · 0 评论 -
98. 验证二叉搜索树
这道题目是一个简单题,但对于没接触过的同学还是有难度的。所以初学者刚开始学习算法的时候,看到简单题目没有思路很正常,千万别怀疑自己智商,学习过程都是这样的,大家智商都差不多。只要把基本类型的题目都做过,总结过之后,思路自然就开阔了,加油💪。原创 2024-09-28 17:58:33 · 811 阅读 · 0 评论 -
530. 二叉搜索树的最小绝对差
遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。同时要学会在递归遍历的过程中如何记录前后两个指针,这也是一个小技巧,学会了还是很受用的。后面我将继续介绍一系列利用二叉搜索树特性的题目。原创 2024-09-28 20:10:38 · 322 阅读 · 0 评论 -
501. 二叉搜索树中的众数
本题在递归法中,我给出了如果是普通二叉树,应该怎么求众数。知道了普通二叉树的做法时候,我再进一步给出二叉搜索树又应该怎么求众数,这样鲜明的对比,相信会对二叉树又有更深层次的理解了。在递归遍历二叉搜索树的过程中,我还介绍了一个统计最高出现频率元素集合的技巧, 要不然就要遍历两次二叉搜索树才能把这个最高出现频率元素的集合求出来。为什么没有这个技巧一定要遍历两次呢?因为要求的是集合,会有多个众数,如果规定只有一个众数,那么就遍历一次稳稳的了。原创 2024-09-28 22:31:31 · 1258 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
这道题目刷过的同学未必真正了解这里面回溯的过程,以及结果是如何一层一层传上去的。求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。但是公共祖先是p或q自身时,其实没有不是每个节点都遍历了,比如下图遍历到4的时候就返回了,4的子树不会遍历了。要理解如果返回值left为空,right不为空为什么要返回。原创 2024-09-29 23:18:29 · 1321 阅读 · 0 评论 -
235. 二叉搜索树的最近公共祖先
对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共祖先问题简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。原创 2024-09-30 00:10:36 · 906 阅读 · 0 评论 -
701. 二叉搜索树中的插入操作
首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。然后在递归中,我们重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。原创 2024-09-30 02:07:02 · 671 阅读 · 0 评论 -
450. 删除二叉搜索树中的节点
读完本篇,大家会发现二叉搜索树删除节点比增加节点复杂的多。因为二叉搜索树添加节点只需要在叶子上添加就可以的,不涉及到结构的调整,而删除节点操作涉及到结构的调整。这里我们依然使用递归函数的返回值来完成把节点从二叉树中移除的操作。这里最关键的逻辑就是第五种情况(删除一个左右孩子都不为空的节点),这种情况一定要想清楚。而且就算想清楚了,对应的代码也未必可以写出来,所以这道题目既考察思维逻辑,也考察代码能力。原创 2024-09-30 23:22:29 · 1051 阅读 · 0 评论 -
669. 修剪二叉搜索树
修剪二叉搜索树其实并不难,但在递归法中大家可看出我费了很大的功夫来讲解如何删除节点的,这个思路其实是比较绕的。最终的代码倒是很简洁。如果不对递归有深刻的理解,这道题目还是有难度的!原创 2024-10-01 01:08:04 · 662 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树
在二叉树专题中,已经写了多道构造二叉树的题目了,其实思路也是一样的,不断中间分割,然后递归处理左区间,右区间,也可以说是分治。此时相信大家应该对通过递归函数的返回值来增删二叉树很熟悉了,这也是常规操作。在定义区间的过程中我们又一次强调了循环不变量的重要性。原创 2024-10-01 14:06:16 · 1077 阅读 · 0 评论 -
538. 把二叉搜索树转换为累加树
经历了前面各种二叉树增删改查的洗礼之后,这道题目应该比较简单了。好了,二叉树已经接近尾声了,接下来就是要对二叉树来一个大总结了。原创 2024-10-01 14:39:58 · 772 阅读 · 0 评论