面试题34 二叉树中和为某一值的路径 回溯法+递归+深度优先搜索

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

示例:
给定如下二叉树,以及目标和 sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1
返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

思路

按深度优先遍历所有节点。

如果当前节点恰好满足给出的target,则将当前遍历的路径作为一个list append到result中;

如果当前节点为空,则返回继续遍历下一个节点;

否则,记录当前路径,并且根据当前节点的值更新目标值,开始遍历下一个节点。

 

Note:


1. 需要进行路径恢复。即向上回溯前,需要将当前节点从路径 res 中删除,即执行 res.pop().

2. 见下面的引用:

记录路径时若直接执行 result.append(res) ,则是将 res 对象加入了 result ;后续 res 改变时, result 中的 res 对象也会随之改变。

正确做法:result.append(list(res))  ,相当于复制了一个 res 并加入到 result 

作者:jyd
链接:https://leetcode-cn.com/problems/er-cha-shu-zhong-he-wei-mou-yi-zhi-de-lu-jing-lcof/solution/mian-shi-ti-34-er-cha-shu-zhong-he-wei-mou-yi-zh-5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

代码

# 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 (not root):
            return []
        self.result = []
        self.res = []
        self.subPathSum(root, sum)

        return self.result

    def subPathSum(self, root, target):
        if not root:
            return None
        self.res.append(root.val)
        if (root.val == target) and (not root.right) and (not root.left):
            self.result.append(list(self.res))
            print(self.result)

        target = target-root.val
        self.subPathSum(root.right, target)
        self.subPathSum(root.left, target)
        self.res.pop()  # 回溯上一个节点前需要恢复路径

结果

 

复杂度分析

时间复杂度O(N)

空间复杂度O(N)

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页