1. 112 路径之和
这个题目的最大特点就是起点是根节点,终点是叶子节点,存在一条符合条件的路径就返回True。
1.1 方法一: 可以结合栈,来先序遍历完,看是否存在满足条件的路径:
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
stacks=[(sum-root.val,root)]
flag=False
while stacks:
sum,node=stacks.pop();
if sum==0 and node.left==None and node.right==None:
flag=True
break
if node.left:
stacks.append((sum-node.left.val,node.left))
if node.right:
stacks.append((sum-node.right.val,node.right))
return flag
1.2 方法二:深度搜索
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
flag = False
def sumTree(root, res):
nonlocal flag
if not root:
if res == sum:
flag=True
return
if not root.left and not root.right:
if (res + root.val) == sum:
flag=True
return
if flag == True:
return
if root.left:
sumTree(root.left, res + root.val)
#sumTree(root.right, res)
if root.right:
sumTree(root.right, res+ root.val)
sumTree(root,0)
return flag
2. 113 路径之和II
2.1 结合栈,先序遍历(也可以是中序或者后序遍历)
class Solution:
def pathSum(self, root: TreeNode, sum_: int) -> List[List[int]]:
if not root:
return []
result=[]
res=[root.val]
stacks =[(res,root)]
while stacks:
res,node=stacks.pop()
if not node.left and not node.right and (sum(res)==sum_):
result.append(res)
if node.right:
stacks.append((res+[node.right.val],node.right)) #
if node.left:
stacks.append((res+[node.left.val],node.left)) #
#stacks.append((sum-node.right.val,res.append(node.right.val),node.right))
return result
2.2 深度搜索
class Solution:
def pathSum(self, root: TreeNode, sum_val: int) -> List[List[int]]:
if not root:
return []
result = []
def sumTree(root, res):
if not root:
if sum(res) == sum_val:
result.append(res)
return
if not root.left and not root.right:
if (sum(res) + root.val) == sum_val:
result.append(res+[root.val])
return
if root.left:
sumTree(root.left, res + [root.val])
#sumTree(root.right, res)
if root.right:
sumTree(root.right, res+ [root.val])
sumTree(root,[])
return result