为了求解路径,我们可以将目标数减去每一个路过的节点的值(剩余值),到达一个叶节点时,若剩余值减至为0,则包含该叶节点的路径为一个解。

树的后序遍历的顺序是左子树、右子树和根节点。利用后序遍历,我们可以无需在入栈每个节点时将到达该节点的路径一同入栈,降低了空间复杂度。相反,对每一个节点,在入栈时,我们只需要记录该节点和其对应的剩余值即可
当出现满足条件的路径时,我们只需将栈中从栈底到栈顶的元素依次输出,加上叶节点的值,存入最终结果即可

注意:此法无法用前序和中序来求解,因为根节点的剩余值对左右子树的遍历是必要的,所以根节点要最后访问。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回二维列表,内部每个列表表示找到的路径
    def FindPath(self, root, expectNumber):
        # write code here
        if not root:    return []
        cur = root
        paths = []
        v = []
        cnt = expectNumber
        pre = None
        while cur:
            cnt -= cur.val
            v.append([cur, cnt])
            cur = cur.left
        while v:
            cur, cnt = v.pop()
            if not cur.right or cur.right == pre:
                pre = cur
                if not cur.left and not cur.right and cnt == 0:
                    paths.append([])
                    for node in v:
                        paths[-1].append(node[0].val)
                    paths[-1].append(cur.val)
            else:
                v.append([cur, cnt])
                cur = cur.right
                while cur:
                    cnt -= cur.val
                    v.append([cur, cnt])
                    cur = cur.left
        return paths