![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
树与二叉树
文章平均质量分 62
树与二叉树
辰阳星宇
这个作者很懒,什么都没留下…
展开
-
【算法刷题】树和二叉树题型及方法归纳
二叉树是有左、右孩子的树,存储方式有顺序存储和链式存储。原创 2023-05-24 18:07:39 · 599 阅读 · 0 评论 -
165、【动态规划】leetcode ——337. 打家劫舍 III:记忆化递归+动态规划(C++版本)
因为dp数组是从小到大,大的要基于小的结果去进行操作。所以,需要使用后序遍历的方式,左右中的顺序遍历。底层的结果返回给上一层,上一层处理完后再返回给其上一层。对左右遍历完后,用val1记录不偷时的情况,找出偷下一个结点值更大,还是不偷下一个结点值更大。用val2记录偷时的情况,当前结点加上不偷下一个结点时的情况。,返回值为长度为2的dp数组,下标0表示不偷root的结果,下标1表示偷root的结果。当遍历到该节点时,判定之前是否遍历过,如果遍历过,直接返回。最终,找到二者之间的最大值,返回。原创 2023-02-16 20:15:04 · 328 阅读 · 0 评论 -
113、【树与二叉树】leetcode ——538. 把二叉搜索树转换为累加树:递增数组视角右中左遍历(C++版本)
如果作为数组来看,本题实际上是让当前数组元素的值变为当前值+后续增序数组的值。那么,要做的就只是,从后往前遍历,每次加上后面元素的累加之和即可。对于BST一类的题,如果直接从改变树的结构来思考,试下起来会过于复杂。根据BST的性质,可以将其按照增序数组来思考,能够利用性质简化解题思路。的方式,来实现上述讨论的数组这一过程。每次先遍历右子树,再对中间结点进行操作,再去遍历左子树即可。累加树中的结点的意思:二叉搜索树中的本结点和右侧左子树中最大值之和。来记录已遍历的元素之和,在遇到中间结点时,进行相加操作。原创 2023-01-19 19:33:50 · 93 阅读 · 0 评论 -
112、【树与二叉树】leetcode ——108. 将有序数组转换为二叉搜索树:二分查找树(C++版本)
为了构建平衡二叉搜索树,可采用二分的方式,构建一个二分查找搜索树。因此,本题的关键就在于切割点,划分出左右区间,然后继续向下进行切割。,因为传入的是有序数组,因此本题的切割点时有序数组的中间值,左侧为左区间,右侧右区间。原创 2023-01-19 18:00:02 · 129 阅读 · 0 评论 -
111、【树与二叉树】leetcode ——669. 修剪二叉搜索树:递归法(C++版本)
的情况,也有两种:(1)该结点无左子树,那么直接删除这个结点及以下的子树即可,返回。的情况,有两种:(1)该结点无右子树,那么直接删除这个结点及以下的子树即可,返回。,区别在于删除的是某一区域的节点值,并且要保留区域内部的节点值。(2)该结点有右子树,那么右子树中可能有大于。(2)该结点有左子树,那么左子树中可能有小于。这个结构,用好每次他向下的遍历和返回的值。同理,对于第一次找到结点值大于。的情况,需要继续向右遍历。的情况,需要继续向左遍历。对于第一次找到结点值小于。原创 2023-01-19 11:43:23 · 842 阅读 · 0 评论 -
110、【树与二叉树】leetcode ——450. 删除二叉搜索树中的节点:递归法+迭代法(C++版本)
采用递归的方式,未找到时,根据值的大小,向对应一侧遍历,让其指针指向对应一侧。找到时,对节点进行处理后,返回节结点。原创 2023-01-18 20:34:08 · 94 阅读 · 0 评论 -
109、【树与二叉树】leetcode ——701. 二叉搜索树中的插入操作:递归法+双指针迭代法(C++版本)
指针记录前一个遍历的结点,当遍历到插入位置时,让。的孩子指针指向该插入位置。原创 2023-01-18 13:12:05 · 105 阅读 · 0 评论 -
108、【树与二叉树】leetcode ——235. 二叉搜索树的最近公共祖先:普通树解法+BST性质解法(C++版本)
【代码】108、【树与二叉树】leetcode ——235. 二叉搜索树的最近公共祖先:普通树解法+BST性质解法(C++版本)原创 2023-01-18 12:34:04 · 72 阅读 · 0 评论 -
107、【树与二叉树】leetcode ——236. 二叉树的最近公共祖先:回溯法(C++版本)
自底向上的返回信息,采用后序遍历的方式。当从左孩子或右孩子中找到p或q,则返回这个结点。这个结点再想上传递给上面的结点。(1)p和q分别在左、右子树中,此时返回最近公共祖先结点;(2)p和q在同一侧子树中,此时谁为祖先结点返回谁。原创 2023-01-17 17:16:54 · 90 阅读 · 0 评论 -
106、【树与二叉树】leetcode ——501. 二叉搜索树中的众数:双指针法+哈希表法(C++/Python版本)
最后将与出现最大次数相同的数加入到结果集中。,按中序遍历将结点存入其中。记录,当前等于该结点数值的结点个数。指向前一个遍历结点,另一个指针。统计各值出现的次数,用。原创 2023-01-17 13:08:09 · 149 阅读 · 0 评论 -
105、【树与二叉树】leetcode ——530. 二叉搜索树的最小绝对差:中序遍历递归法+迭代法(C++/Python版本)
利用BST的特性,采用中序遍历的方式,可以得到单调递增的元素。原创 2023-01-17 11:32:25 · 117 阅读 · 0 评论 -
104、【树与二叉树】leetcode ——98. 验证二叉搜索树:递归法[先序+中序+后序]+迭代法(C++/Python版本)
BST的特点是:当前结点的值,比左子树中的全部结点都大,比右子树中全部结点都小。在代码实现中,要注意不要对比的是某一结点和某一侧的全部值之间的关系,不能只有结点与结点间的关系对比,否则容易出现非法BST。对于第一种情况,左子树的左子树结点,只要其左结点比当前结点小即可。根据BST的特点,当对BST进行中序遍历时,结点的值应呈单调递增的形式。,记录上一个遍历元素的值,若为BST,则当前的值,应大于上一个遍历的值。BST要保证,当前节点全部大于左子树中的结点,全部小于右子树中的结点。原创 2023-01-16 23:25:59 · 425 阅读 · 0 评论 -
103、【树与二叉树】leetcode ——700. 二叉搜索树中的搜索:递归法+迭代法(C++/Python版本)
根据BST的特性,左子树比根节点小,右子树比根节点大。原创 2023-01-16 20:31:24 · 99 阅读 · 0 评论 -
102、【树与二叉树】leetcode ——654. 最大二叉树(C++版本)
相同,找到最大值作为分割点。再往下递归的去分割左、右子树,直至只剩一个结点时,返回该节点。原创 2023-01-16 18:57:21 · 75 阅读 · 0 评论 -
101、【树与二叉树】leetcode ——617. 合并二叉树:递归法+迭代法(C++版本)
【代码】101、【树与二叉树】leetcode ——617. 合并二叉树:递归法+迭代法(C++版本)原创 2023-01-16 17:57:07 · 81 阅读 · 0 评论 -
100、【树与二叉树】leetcode ——105. 从前序与中序遍历序列构造二叉树+106. 从中序与后序遍历序列构造二叉树(C++版本)
(3)先序序列分割区间:左子树:(begin,begin+中序左子树长度),右子树:[begin+中序左子树长度,end)先找到中序序列的分割位置,然后分割出中序序列左子树和右子树。(此时要排除后序序列的结点元素,也就是最后一个元素)。(2)中序序列分割区间:左子树:[begin,分割点),右子树:(分割点,end)(5)执行到最后,返回结点元素。(后序序列最后一个元素),作为结点元素。中序的特点:左中右,后序的特点:左右中。(1)先判定数组大小,若为0,说明为空节点;(1)分割点:先序序列的第一个元素。原创 2023-01-14 21:31:50 · 169 阅读 · 0 评论 -
99、【树与二叉树】leetcode ——113. 路径总和 II:回溯法两种版本(C++版本)
的,则输出,否则分别再向左子树、右子树探测。函数结尾时候,再把添加的这个结点。此方式是,每次判定出左子树或右子树为空时,就提前将该结果加入。此方式是,每次遍历时候,将当前结果添加到。当中,退出时候,再分别从退出口。存当前路径,设置一个。原创 2023-01-14 18:35:15 · 99 阅读 · 0 评论 -
98、【树与二叉树】leetcode ——112. 路径总和:5行精简代码回溯法[带剪枝]+迭代法(C++版本)
【代码】98、【树与二叉树】leetcode ——112. 路径总和:回溯法[带剪枝]+迭代法(C++版本)原创 2023-01-14 13:25:46 · 101 阅读 · 0 评论 -
97、【树与二叉树】leetcode ——513.找树左下角的值:层次遍历+回溯法(C++版本)
原题链接:513. 找树左下角的值要找到最底层的最左边元素,首先要确定深度最大的子树,然后找到其最左边的叶子结点(也就是最后一层的第一个结点)。层序遍历最适合解本题,因层序遍历是按成遍历,因此,最后一次遍历的一定为最后一层,记录遍历最后一层的第一个元素即为最底层的最左边叶子。二、递归法:回溯想要找到最后一层的最左端叶子,需要计算两个东西。第一,需要计算出最大深度,第二需要计算出最后一层的第一个叶子。设置一个记录最大深度,设置一个记录结果。若当前遍历的深度比之前已记录的最大深度更大,则记录当前的叶子结点原创 2023-01-14 12:40:49 · 101 阅读 · 0 评论 -
96、【树与二叉树】leetcode ——404. 左叶子之和:递归法[先序+后序]+迭代法[先序+层次](C++版本)
采用后续遍历的方式,遍历左,遍历右,将结果返回给上一个结点。左孩子一定在每个子树的最左侧,因此设置一个局部参数。提前判定左叶子,当发现该节点的后续结点有。当遍历到叶子节点时,若。,当每次遍历的是左子树时,令其为。,则就将这个叶子结点的值相加。每一层接受上一层传来的。说明为左孩子,相加。原创 2023-01-13 18:16:51 · 226 阅读 · 0 评论 -
95、【树与二叉树】leetcode ——257. 二叉树的所有路径:递归法DFS/回溯法+迭代法DFS+层序遍历BFS(C++版本)
【代码】95、【树与二叉树】leetcode ——257. 二叉树的所有路径:递归法DFS/回溯法+迭代法DFS+层序遍历BFS(C++版本)原创 2023-01-13 17:25:06 · 98 阅读 · 0 评论 -
94、【树与二叉树】leetcode ——110. 平衡二叉树(C++版本)
在这里要和这个作比较。深度,实际上是从上到下,求二叉树的路径,对应的为先序遍历。高度,实际上是从下到上,求二叉树的路径,对应的为后序遍历。当所求时,可分别用先序和后序遍历求深度或高度。对于求高度的题,最适宜的使用后序遍历,自底向上返回信息。时间复杂度On空间复杂度On。原创 2023-01-13 12:17:43 · 437 阅读 · 0 评论 -
93、【树与二叉树】leetcode ——222. 完全二叉树的节点个数:普通二叉树求法+完全二叉树性质求法(C++版本)
遍历一层获取一层结点。原创 2023-01-12 19:00:01 · 313 阅读 · 0 评论 -
92、【树与二叉树】leetcode ——111. 二叉树的最小深度:层次遍历+先序DFS+后序DFS[子问题分解](C++版本)
将求最小深度,转化为求每一个左右子树的最小深度。自底向上,每次都得到左右子树最小深度时,最后得到的总的最小深度,一定为这个树的最小深度。一类问题,因为他需要将所有的情况都遍历完,才能确定最短的情况。,对于中间结点某侧会走到空结点的不进行遍历,从而导致误判。,对于遇到空节点直接返回为0即可。而对本题,由于使用的是。因此规定只有遇到,叶子结点才返回。最小深度的特点是第一次遍历到。,因此需要遍历完所有情况,找。DFS其实并不太适于去处理。注意:后序遍历实际上求得是。,此时该路径为最短路径。在代码实现时,注意和。原创 2023-01-12 17:26:09 · 386 阅读 · 0 评论 -
91、【树与二叉树】leetcode ——559.n叉树的最大深度(递归DFS+迭代BFS)(C++版本)
【代码】91、【栈与队列】leetcode ——559.n叉树的最大深度(递归DFS+迭代BFS)(C++版本)原创 2023-01-12 16:52:17 · 127 阅读 · 0 评论 -
90、【树与二叉树】leetcode ——104. 二叉树的最大深度:层次遍历+DFS+子问题分解(C++版本)
使用栈的特点,第一次执行时,会将初始函数压入栈中,最终结果的答案会在最后返回。之后子函数会不断压栈,计算最大深度,并把计算结果返回给上一次层的函数。想要求出最大深度,也就是得到左子树最大深度和右子树最大深度。将该问题看作,自底向上,每次获取子树的最大深度,即可得到整个树的最大深度。这个实现,实际上也就是二叉树的后序遍历,以左右中的顺序处理,每次处理完中后,即将该层的结果返回给上一层,上一层继续处理。每次是先判定中间节点,再分别处理左、右子树。当中间结点为叶子结点时,判定此时是否为最大高度。原创 2023-01-12 16:49:29 · 325 阅读 · 0 评论 -
89、【树与二叉树】leetcode ——101. 对称二叉树:后序递归+迭代法+层次遍历(C++版本)
然后,再分别让两个指针后续孩子的对称位置进行遍历:左的左与右的右,左的右与右的左。,为对称元素则继续遍历。按照对称位置顺序进行压栈,左的左、右的右、左的右、右的左。每次从栈中弹出两个元素进行操作,这两个元素应分别为互对称位置元素。每次遍历前先判定对称位置上是否有结点,是否值相同。(2)当一个为空,另一个不为空时,说明互不对称;(3)当双方值不相同时,说明互不对称。然后判定是否为对称元素,不为对称元素则。(1)当都为空时,说明遍历到底;原创 2023-01-11 22:52:46 · 324 阅读 · 0 评论 -
88、【树与二叉树】leetcode ——226. 翻转二叉树:先中后序的递归与DFS非递归遍历+BFS层次遍历(C++版本)
中序遍历的实现中,因为先遍历左子树,然后翻转,再遍历右子树。因为此时的右子树因为翻转已经变成了原来的左子树,而现在的左子树才是原来的右子树。因此应该在最后继续发展左子树。对于先、中、后序,使用一个栈来模拟,每遍历到一个结点,就反转左右子树并将左右子树压入栈中进行后续遍历。层次遍历,使用一个队列来进行BFS,每遍历到一层的一个结点,就翻转其左右子树。分别用先、中、后序的递归遍历和DFS非递归非递归遍历和BFS层次遍历实现。的处理方式与递归方式相同,最后压入的也是。,遍历到一个结点就翻转其左右子树。原创 2023-01-11 20:50:31 · 93 阅读 · 0 评论 -
43、【树和二叉树】二叉树的先、中、后和层次遍历方法合集(C/C++版)
先序遍历中序遍历后序遍历非递归算法实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be malloced, assume caller calls free().原创 2021-04-26 11:51:42 · 263 阅读 · 1 评论