给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
第一时间想到的是使用层序遍历,题目要求的其实就是求最后一层的第一个结点的值:
然后试一下递归法来解决,既然是要求最底下的值,那么我尝试选择后续遍历,然后发现没有这么简单,遂取看视频:
怎么找二叉树的左下角? 递归中又带回溯了,怎么办?| LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili
看完才知道原来这个题就直接使用了回溯算法,使用全局变量设置一个深度,通过回溯来测量每个分支的深度,同步更新最大深度,保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
这道题很明显需要使用回溯算法来解决了。我选择定义一个函数,使用递归三部曲第一部定义参数和返回值:传入root,targetSum和一个计算累加值的singesum。
然后定义终止条件:如果 singesum == targetSum就说明我们找到了一条符合条件的路径,直接返回True。
然后左右分别判断递归,然而一套写完以后却发现怎么都不对,于是看视频找自己bug在哪里。
拿不准的遍历顺序,搞不清的回溯过程,我太难了! | LeetCode:112. 路径总和_哔哩哔哩_bilibili
以下是我的错误代码,感觉这个坑非常有代表性:
class Solution:
def traversal(self, root, singesum, targetSum):
if not (root.left or root.right) and singesum == targetSum:
return True
if root.left:
singesum += root.left.val
left = self.traversal(root.left,singesum,targetSum)
singesum -= root.left.val
if root.right:
singesum += root.right.val
right = self.traversal(root.right,singesum ,targetSum)
singesum -= root.right.val
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
if not root:
return False
return self.traversal(root, root.val, targetSum)!= None
代码中加粗的位置就是本题是坑所在,本题中递归是有返回值的,如果左孩子的递归函数有符合要求的路径应该直接将这个True向上返回,右孩子也是同理。
加了这个条件就通过了,这道题可以说是非常有意思了,虽然是简单题,但是感觉一点都不简单。
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
有了上题的经验这次回溯就注意了许多,由于需要遍历完整颗树,这里递归函数不需要返回值。
当遍历到根节点时计算path的总和如何符合条件数组result就记录path,注意这里python添加path的时候语法为 result.append(path[:])
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
这道题难就难在细节太多了,先去看视频理清思路:
坑很多!来看看你掉过几次坑 | LeetCode:106.从中序与后序遍历序列构造二叉树_哔哩哔哩_bilibili
看了三遍以后就可以自己做了,做这道题需要把中序和后序数组画出来模拟切割才更好理解:
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
有了上题的经验,这题就老老实实六步走了: