题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:
本题是深度优先遍历的一个变形,通过遍历判断从根节点一直往下知道叶子结点所经过的结点和是否等于该整数。
注意:与二叉树的深度优先遍历不同的是,我们考虑的是由多个结点组成的路径,将其存储在列表中,在遍历过程中,不断向列表中添加元素,直到叶子结点,然后判断列表元素和
可用递归和非递归两种方法解决
递归
# -*- 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
result=[]
if not root:
return result
self.sum=expectNumber
self.DFS(root, result, [root.val])
return result
def DFS(self, root, result, path):
if not root.left and not root.right and sum(path) == self.sum:
result.append(path)
if root.left:
self.DFS(root.left, result, path + [root.left.val])
if root.right:
self.DFS(root.right, result, path + [root.right.val])
A = TreeNode(1)
A1 = A.left = TreeNode(2)
A2 = A.right = TreeNode(3)
A1.left = TreeNode(4)
A1.right = TreeNode(5)
A2.left = TreeNode(6)
A2.right = TreeNode(7)
s = Solution()
print(s.FindPath(A,8))
非递归
# -*- 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
result=[]
if not root:
return result
queue = []
queue.append((root,[root.val]))
while queue:
root,path = queue.pop(0)
if not root.left and not root.right and sum(path)==expectNumber:
#题目要求在返回值的list中,数组长度大的数组靠前,因为越往前插入符合条件的路径长度越小
result.insert(0,path)
if root.left:
queue.append((root.left,path+[root.left.val]))
if root.right:
queue.append((root.right,path+[root.right.val]))
return result
A = TreeNode(10)
A1 = A.left = TreeNode(12)
A2 = A.right = TreeNode(5)
A2.left = TreeNode(4)
A2.right = TreeNode(7)
s = Solution()
print(s.FindPath(A,22))