剑指Offer-二叉树-二叉树中和为某一值的路径

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值