为了求解路径,我们可以将目标数减去每一个路过的节点的值(剩余值),到达一个叶节点时,若剩余值减至为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



京公网安备 11010502036488号