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 是树的节点数。空间复杂度主要取决于返回列表空间的开销,元素个数不会超过树的节点数
空间复杂度:O(N),其中 N 是树的节点数。空间复杂度主要取决于返回列表空间的开销,元素个数不会超过树的节点数
参考资料: