34. 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22:
返回:
解题思路:
- DFS是深度的搜索,BFS是横向的搜索,参考打印二叉树
剑指offer_32.从上到下打印二叉树 - 使用 DFS 遍历整个树的过程中,保存好每一条路径的节点,直到到达叶节点的时候,判断当前存储的路径和是否等于题所给数值,如果是的话,就将结果保存下来,不然的话就一层层的返回,这个过程其实本质上是一个栈的进入与抛出过程。
- 还有一点需要注意的就是,使用python时,注意下深拷贝和浅拷贝
- 时间复杂度O(n),n为节点个数.空间复杂度为O(m)),m为所要存储的最终路径的节点个数
算法流程:
- 定义递归函数
- 如果满足每次传入的root存在
1.递归函数的终止条件:在末尾节点(左右节点均不存在)对栈中储存的路径节点相加,如果判定成功则加入result,所有情况均将栈顶弹出,并返回上一层递归。
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, sum_: int) -> List[List[int]]:
# if root is None:return []
result = []
temp = []
#函数是为了对所有的子树进行搜索,并将符合条件的结果加入到result中
def dfs(root,sum_):
if root:
#递归终止条件
if not root.left and not root.right:
temp.append(root.val)
if sum(temp) == sum_:
result.append(temp[0:])
temp.pop()
return
#递归等价条件
temp.append(root.val)
dfs(root.left,sum_)
dfs(root.right,sum_)
#取出已经遍历过的栈内容
temp.pop()
dfs(root,sum_)
return result