题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路:
暴力遍历二叉树每一个节点,采用递归回溯的思想。建立一个全局的results数组保存所有结果的信息,如果遍历到了叶子节点并且和正好为expect,那么将此时的数组加入到results中
采用回溯的思想:每次递归的时候,使用一个Result数组保存当前数组,不管递归成功或者失败,递归结束之后,都需要回溯到Result数组
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def __init__(self):
self.results = []
def Sum(self, result):
sum = 0
for i in result:
sum += i
return sum
# 返回二维列表,内部每个列表表示找到的路径
def FindPathCore(self, root, expectNumber, result):
result.append(root.val)
Result = result[:]
if self.Sum(result) == expectNumber and root.left == None and root.right == None:
self.results.append(result)
if root.left:
self.FindPathCore(root.left, expectNumber, result)
result = Result
if root.right:
self.FindPathCore(root.right, expectNumber, result)
def BubbleSort(self, results):#冒泡排序将results变为又大到小
for i in range(len(results)):
for j in range(len(results) - 1, i, -1):
if len(results[j]) > len(results[i]):
results[i], results[j] = results[j], results[i]
def FindPath(self, root, expectNumber):
# write code here
if root == None:
return []
self.FindPathCore(root, expectNumber, [])
self.BubbleSort(self.results)
return self.results
改进算法:
class Solution:
def __init__(self):
self.results = []
def RecursionFindPath(self, root, expectNumber, result):
result.append(root.val)
if root.left == None and root.right == None and sum(result) == expectNumber:
self.results.append(result)
temp = result[:]
if root.left:
self.RecursionFindPath(root.left, expectNumber, result)
result = temp[:]
if root.right:
self.RecursionFindPath(root.right, expectNumber, result)
def FindPath(self, root, expectNumber):
if root == None:
return []
self.RecursionFindPath(root, expectNumber, [])
self.results = sorted(self.results, key=len, reverse=True)
return self.results
if __name__ == '__main__':
root = TreeNode(1)
root.left = TreeNode(2)
root.left.left = TreeNode(4)
root.right = TreeNode(3)
root.right.right = TreeNode(2)
root.right.right.left = TreeNode(1)
root.right.right.right = TreeNode(5)
expectNum = 7
print(Solution().FindPath(root, expectNum))
[[1, 3, 2, 1], [1, 2, 4]]
Process finished with exit code 0