输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。
从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
在函数退出之前要在路径上删除当前节点并减去当前节点的值,以确保返回父节点时路径刚好是从根节点到父节点。
class Solution:
def __init__(self):
self.res = None
self.stack = None
def path_in_tree(self, root, num):
if not root:
return []
self.find_path(root, num)
if self.res is None:
return []
return list(sorted(self.res, key=len, reverse=True))
def find_path(self, root, num):
if self.stack is None:
self.stack = []
self.stack.append(root.val)
if num == sum(self.stack) and not root.left and not root.right:
if self.res is None:
self.res = []
self.res.append(self.stack[:]) # 切片形式深复制
if root.left:
self.find_path(root.left, num)
if root.right:
self.find_path(root.right, num)
self.stack.pop()
st = Solution()
bt = TreeNode(8)
bt.left = TreeNode(9)
bt.right = TreeNode(17)
bt.left.left = TreeNode(14)
bt.left.right = TreeNode(7)
bt.left.right.right = TreeNode(7)
bt.right.right = TreeNode(6)
print(st.path_in_tree(bt, 31))
第二种方法
class Solution:
def __init__(self):
self.res = None
self.stack = None
def path_in_tree(self, root, num):
if not root:
return []
if root and not root.left and not root.right and num == root.val:
return [[root.val]]
res = []
left = self.path_in_tree(root.left, num-root.val)
right = self.path_in_tree(root.right, num-root.val)
print(left, right)
for u in left+right:
res.append([root.val] + u)
return res
st = Solution()
bt = TreeNode(10)
bt.left = TreeNode(5)
bt.right = TreeNode(12)
bt.left.left = TreeNode(4)
bt.left.right = TreeNode(7)
print(st.path_in_tree(bt, 22))
(最近更新:2019年07月24日)