题目描述
时间限制
C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:495548
本题知识点
树(相关题目链接)
题目详细信息
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)(题目链接)
解决思路
相关知识
输出二叉树的从根结点到每个叶子节点的路径,可以通过二叉树的深度优先遍历实现。有递归和非递归两种解决思路。
递归解法
class TreeNode:
def __init__(self, value):
self.val = value
self.left = None
self.right = None
class Solution:
def binaryTreePaths(self, root):
res= []
if root == None:
return res
self.DFS(root, res, [root.val])
return res
def DFS(self, root, res, path):
if root.left == None and root.right == None:
res.append(path)
if root.left != None:
self.DFS(root.left, res, path + [root.left.val])
if root.right != None:
self.DFS(root.right, res, path + [root.right.val])
非递归解法
通过填加栈实现
class TreeNode:
def __init__(self, value):
self.val = value
self.left = None
self.right = None
class Solution1:
def binaryTreePaths1(self, root):
res = []
if root == None:
return res
stack = []
stack.append((root, [root.val]))
while stack:
node, path = stack.pop()
if node.left == None and node.right == None:
res.append(path)
if node.left != None:
stack.append((node.left, path + [node.left.val]))
if node.right != None:
stack.append((node.right, path + [node.right.val]))
return res
本题变形解决
其实这一题就是引出所有的从根结点到叶子结点的路径的变形,就在判断条件上多了一个 sum(path) == self.sums。
递归
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
res=[]
if root==None:
return res
self.sums=expectNumber
self.DFS(root,res,[root.val])
return res
def DFS(self,root,res,path):
if root.left==None and root.right==None and sum(path)==self.sums:
res.append(path)
if root.left!=None:
self.DFS(root.left,res,path+[root.left.val])
if root.right!=None:
self.DFS(root.right,res,path+[root.right.val])
非递归
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
res = []
if root == None:
return res
stack = []
stack.append((root, [root.val]))
while stack:
node, path = stack.pop()
if node.left == None and node.right == None and sum(path) == expectNumber:
res.append(path)
if node.right != None:
stack.append((node.right, path + [node.right.val]))
if node.left != None:
stack.append((node.left, path + [node.left.val]))
#对结果按照内含数组长度降序排列
res.sort(key = lambda i:len(i),reverse=True)
return res