我好像洞察到二叉树路径和的秘密

在力扣上面,二叉树路径和一直是一块很大的问题,通过各种方法遍历二叉树,寻找到想要的路径,这种方法就叫路径和,那么,通过什么样的解法去思考呢。

1,递归

递归主要就是递归公式和结束条件的选择。这里有如下两条方法。

class solution:
    def func(root,target):
        if not root:
            return target
\


class solution:
    def func(root,target):
        if not root.left and not root.right:
            return target

在不去看其他条件的情况下,这两个结束条件有什么区别第一个是当遍历完所有的root,也即当前所在的节点为TreeNode(None)的时候进行输出,另外一个是在叶子节点的时候进行输出。

第一个的好处当然是可以覆盖掉root为空的情况,当你给进去的一个值是空的,这一下子就输出,但是坏处呢,就是无法向上递归,遍历是遍历了,可是寻找上一节点还有些问题。虽然二叉树没有这方面问题。

那么下面的判断条件其实也要进行调换。尤其是前面一个的话,只能等到递归为空的时候才进行判断,缺少很多灵活性,而当递归到叶子节点在进行判断的话,选择性多很多。

class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        def recur(root,target):
            if not root and target == 0:
                return True
            if not root:return False

            target-= root.val
            return recur(root.left, target) or recur(root.right, target)
        if not root:return False
        return recur(root,targetSum)
class soluttion:
    def func(root,target):
        if not root:return False
        if not root.left and not root.right:
            return target == root.val

        return func(root.left,target - root.val) or func(root.right, target - root.val)

以上两个就是用于两个不同判断条件写出来的代码,第一个不能完全覆盖力扣的测试用例,不知道是啥情况。

可以用队列去做的话,思路差不多,在队列中加入一个root.val项目。

class solution:
    def queue(root,target):
        if not root:return False
        que = [(root, root.val)]
        while que:
            root, path = que.pop(0)
            if not root.left and not root.right:
                return path == target

            if root.left:
                que += [(root.left, root.left.val + path)]
            if root.right:
                que += [(root.right, root.right + path)]

这里有几个坑,首先,做这种路径判断建议是用叶子节点去判断。千万别去判断为空的情况。

所以结束条件是:

if not root.left and not root.right and path == targetSum:
    return True

并且在末尾加上return False

栈跟队列差不对的解法。

本法参考力扣负雪明烛的解法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值