from collections import deque class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None class Tree(object): def __init__(self): self.root = None def construct_tree(self, values=None): if not values: return None self.root = TreeNode(values[0]) queue = deque([self.root]) leng = len(values) nums = 1 while nums < leng: node = queue.popleft() if node: node.left = TreeNode(values[nums]) if values[nums] else None queue.append(node.left) if nums + 1 < leng: node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None queue.append(node.right) nums += 1 nums += 1 def find_path(tree, num): ret = [] if not tree: return ret path = [tree] sums = [tree.val] def dfs(tree): if tree.left: path.append(tree.left) sums.append(sums[-1]+tree.left.val) dfs(tree.left) if tree.right: path.append(tree.right) sums.append(sums[-1] + tree.right.val) dfs(tree.right) if not tree.left and not tree.right: if sums[-1] == num: ret.append([p.val for p in path]) path.pop() sums.pop() dfs(tree) return ret if __name__ == '__main__': t = Tree() t.construct_tree([1, 3, 6, 4, 3, 1, 1]) print find_path(t.root, 8)