代码随想录算法训练营第十八天| 二叉树part05

513. 找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

第一时间想到的是使用层序遍历,题目要求的其实就是求最后一层的第一个结点的值:

然后试一下递归法来解决,既然是要求最底下的值,那么我尝试选择后续遍历,然后发现没有这么简单,遂取看视频:

 怎么找二叉树的左下角? 递归中又带回溯了,怎么办?| LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili

 看完才知道原来这个题就直接使用了回溯算法,使用全局变量设置一个深度,通过回溯来测量每个分支的深度,同步更新最大深度,保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。

112. 路径总和

给你二叉树的根节点 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向上返回,右孩子也是同理。

加了这个条件就通过了,这道题可以说是非常有意思了,虽然是简单题,但是感觉一点都不简单。 

113. 路径总和 II

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

有了上题的经验这次回溯就注意了许多,由于需要遍历完整颗树,这里递归函数不需要返回值。

当遍历到根节点时计算path的总和如何符合条件数组result就记录path,注意这里python添加path的时候语法为 result.append(path[:])

106. 从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

这道题难就难在细节太多了,先去看视频理清思路:

坑很多!来看看你掉过几次坑 | LeetCode:106.从中序与后序遍历序列构造二叉树_哔哩哔哩_bilibili

看了三遍以后就可以自己做了,做这道题需要把中序和后序数组画出来模拟切割才更好理解:

 

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

有了上题的经验,这题就老老实实六步走了:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值