1、采用深度优先搜索的方式,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径。
2、我们也可以采用广度优先搜索的方式,遍历这棵树。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径。为了节省空间,我们使用哈希表记录树中的每一个节点的父节点。每次找到一个满足条件的节点,我们就从该节点出发不断向父节点迭代,即可还原出从根节点到当前节点的路径。
Python版本:
class Solution:
    # 返回二维列表,内部每个列表表示找到的路径
    def FindPath(self, root, expectNumber):
        # write code here
        results = []
        if root == None:
            return results
        self.sum = expectNumber
        self.DFS(root, results, [root.val])
        return results
    def DFS(self, root, results,path):
        if root.left == None and root.right == None and sum(path) == self.sum:
            results.append(path)
        if root.left != None:
            self.DFS(root.left, results,path+[root.left.val])
        if root.right !=None:
            self.DFS(root.right, results, path+[root.right.val])

复杂度分析:

时间复杂度:O(N^2),其中 N 是树的节点数。在最坏情况下,树的上半部分为链状,下半部分为完全二叉树,并且从根节点到每一个叶子节点的路径都符合题目要求。此时,路径的数目为 O(N),并且每一条路径的节点个数也为 O(N),因此要将这些路径全部添加进答案中,时间复杂度为 O(N^2)
空间复杂度:O(N),其中 N 是树的节点数。空间复杂度主要取决于返回列表空间的开销,元素个数不会超过树的节点数


参考资料: