Python3-[33]二叉树中和为某一值的路径(DFS)

题目

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。

说明: 叶子节点是指没有子节点的节点。

解题思路

1.用sums依次减去节点的值,直到叶子节点的值为sums
2.设置辅助变量res,初始为0,一直加到叶子节点时,res+root.val==sums

代码 --1.依次相减
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def pathSum(self, root: TreeNode, sums: int) -> List[List[int]]:
        #对112路径总和的扩展,要求返回所有的路径
        if not root:return []
        def hasChild(x):
            return x.left or x.right
        
        path=[]
        def DFS(root,temp,sums):
            if not root:return
            if not hasChild(root) and root.val==sums:#当到叶子节点时,root.val==sums
                temp.append(root.val)#temp+=[root.val] 
                path.append(temp)#将一种可能添加到路径
                return
            if root.left:DFS(root.left,temp+[root.val],sums-root.val)
            if root.right:DFS(root.right,temp+[root.val],sums-root.val)
        DFS(root,[],sums)
        return path
代码 --2.加辅助变量,依次相加
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def pathSum(self, root: TreeNode, sums: int) -> List[List[int]]:
        #对112路径总和的扩展,要求返回所有的路径
        if not root:return []
        def hasChild(x):
            return x.left or x.right
        res=0
        path=[]
        def DFS(root,temp,res):
            if not root:return 
            if not hasChild(root) and sums-root.val==res:#当到叶子节点时,root.val==sums
                tem.append(root.val)#temp+=[root.val] 
                path.append(temp)#将一种可能添加到路径
                return
            if root.left:DFS(root.left,temp+[root.val],res+root.val)
            if root.right:DFS(root.right,temp+[root.val],res+root.val)
        DFS(root,[],res)
        return path

扩展: 求从根节点到子节点的个数<2的末节点的和为sum的路径

这时我们可以把条件改为not root and sums == 0 and tuple(path) not in vis
我们得到相应的代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def pathSum(self, root: TreeNode, sums: int) -> List[List[int]]:
        if not root: return []
        hasChid = lambda x: x.left or x.right 
        def DFS(root,path,res,sums):
            if not root and sums != 0: return #[]
            if not root and sums == 0 and tuple(path) not in vis:
                res.append(path[:])
                vis.add(tuple(path))
                return 
            #if root
            DFS(root.left,path+[root.val],res,sums-root.val)
            DFS(root.right,path+[root.val],res,sums-root.val)
        res = []
        path = []
        vis = set()
        DFS(root,path,res,sums)
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值