能帮到你的话,就给个赞吧 😘
二叉树推导
是否可以通过两颗子树相同问题的结果推导出树的答案(形式为递归)。
树 = 树的根节点 + 子树
题单01-推导(容易)
有些问题,非常容易看出可以通过子树的相同问题解决树的问题。
01 104. 二叉树的最大深度
非常容易看出可以通过子树的最大深度解决树的最大深度
即:子树的最大深度 + 1 = 树的最大深度
02 1379. 找出克隆二叉树中的相同节点
非常容易看出可以通过子树查找解决树的查找
即:子树查找 + 根节点查找 = 树的查找
03 100. 相同的树
非常容易看出可以通过子树相同解决树是否相同
即:子树相同 + 根节点相同 = 树相同
04 572. 另一棵树的子树
非常容易看出可以通过子树有无另一颗解决树有无另一颗
即:子树另一颗 + 根节点的树另一颗 = 树的另一棵树
可能会有疑问,根节点的树不就是自己吗,没错。
但这个仅仅是将原树与subRoot比较
而问题 另一棵树的子树 则还要再去子树查找。也就是
isSameTree(root, subRoot) != isSubtree(root, subRoot)
isSameTree是比较root和subRoot是否相同。而
isSubtree是在root中查找是否有subRoot存在
可见 自己!=自己。但自己的问题 定= 自己的问题。
05 1367. 二叉树中的列表
非常容易看出可以通过子树有无列表解决树有无列表
即:子树列表 + 根节点树列表 = 树的列表
同572
06 144. 二叉树的前序遍历
非常容易看出可以通过子树前序解决树的前序
即:根节点 + 子树前序 = 二叉树前序
07 105. 从前序与中序遍历序列构造二叉树
08 889. 根据前序和后序遍历构造二叉树
题单02-情况(容易)
有些问题依旧容易看出可以通过子树的相同问题解决。
但直观推论并不能通过。而是要结合错误,具体情况,具体分析。
01 112. 路径总和
树为叶子节点时 != 子树
而是
树为叶子节点时 = 根节点
02 938. 二叉搜索树的范围和
并非所有情况都 = 树的和,而是要分情况
树的根节点<范围
树的根节点>范围
树的根节点∈范围
03 111. 二叉树的最小深度
没有左树
没有右树
两树都有
04 114. 二叉树展开为链表
执行报错:null pointer
表示没有处理指针为空的情况
需要检查代码中哪些指针执行却没有提前判空
05 897. 递增顺序搜索树
1.你需要判断是处理子树,还是处理子树处理后的结果
可以对比111。如果仅仅是需要判断左树是否为空,则可直接判断,不需要处理子树。
2.子树处理后的结果并不会直接对应到root上.而是要手动连接
06 113. 路径总和 II
同112
树为叶子节点时 != 子树
= 根节点
题单03-时机(容易)(单独讲)
01 226. 翻转二叉树
02 1325. 删除给定值的叶子节点
03 998. 最大二叉树 II
题单04-转化(较难)
问题经过推导发现不能通过子树的相同问题解决。
但可发现原问题F = G,G可通过子树的相同问题解决
转化是比较难的,因为这两步都挺难的
01 101. 对称二叉树
1.子树对称 与 树对称 无关
2.两颗子树镜像 = 树对称
3.两颗子树镜像可通过子树镜像解决
题单05-综合
此题单需要综合知识点,但已经过筛选,都为推导
01 951. 翻转等价二叉树
116. 填充每个节点的下一个右侧节点指针
08 1110. 删点成林(练习)
04 124. 二叉树中的最大路径和(遍历)
02 894. 所有可能的真二叉树
如何不会被误导找关系呢。那就要往题目的信息方向去思考。
树中的每个元素都是一棵真二叉树的根节点。
例如 5的真二叉树,其左节点与右节点也是真二叉树。
那么其子树为(1,3)/(3,1) 加 根节点 = 5
例如 7 其左节点与右节点也是真二叉树。
那么其子树为(1,5)/(5,1)/(3,3) 加 根节点 = 7
会员
1430. 判断给定的序列是否是二叉树从根到叶的路径🔒
426. 将二叉搜索树转化为排序的双向链表🔒
1660. 纠正二叉树🔒
1490. 克隆 N 叉树🔒
1485. 克隆含随机指针的二叉树🔒
推导注意事项
1.需要判断是处理子树,还是处理子树处理后的结果
可见897 与 111
2.子树处理后的结果并不会直接对应到root上.而是要手动连接
可见897
3.null pointer报错时,需要检查哪些指针执行却没有判空
可见114