题目
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
说明: 叶子节点是指没有子节点的节点。
解题思路
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