题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
输入输出示例
示例1
输入:{10,5,12,4,7},22
返回值:[[10,5,7],[10,12]]
示例2
输入:{10,5,12,4,7},15
返回值:[]
解题思路
- 考虑树为空的情况,直接返回[]
- 首先要做遍历,要有一个返回值ret=[],一个保存遍历节点的列表temp=[],一个保存每次遍历路径的列表nodeArrayList=[],一个保存多个路径的列表tempArrayList=[]
- 广度优先的方式遍历二叉树:
从根节点出发,存在左子树,遍历根节点的左子树,将左节点加入到temp中,拷贝当前遍历的路径列表,将当前左节点的值加入到单路径列表中,再讲单路径列表加入到多路径列表中;
存在右子树,与左子树做法一致。 - 判断当前节点为叶子节点时(即当前节点的左节点和右节点都为空),判断此时所遍历的路径值之和是否等于给定的值,如果相等,则将该路径保存到返回值列表的头。
代码示例
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
import copy
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def FindPath(self, root, expectNumber):
# write code here
# 判断空的情况
if root == None:
return []
# 用来保存返回值
res = []
# 层次遍历
# 队列,保存遍历节点
temp = []
temp.append(root)
# 保存遍历的所有路径列表组成的列表
tempArrayList = [[root.val]]
while temp:
tempNode = temp.pop(0)
# 一个路径的列表
nodeArrayList = tempArrayList.pop(0)
# 判断当某一分支遍历到叶子节点时,路径之和是否与特定值相等
if tempNode.left == None and tempNode.right == None:
if sum(nodeArrayList) == expectNumber:
res.insert(0, nodeArrayList)
# 广度优先遍历
# 左子树
if tempNode.left:
temp.append(tempNode.left)
# 对nodeArrayList进行浅拷贝,重新创建一个变量名也指向该变量
newnodeArrayList = copy.copy(nodeArrayList)
# 将左节点的值加入路径中
newnodeArrayList.append(tempNode.left.val)
# 将路径加入保存所有路径的队列中
tempArrayList.append(newnodeArrayList)
# 右子树
if tempNode.right:
temp.append(tempNode.right)
newnodeArrayList = copy.copy(nodeArrayList)
newnodeArrayList.append(tempNode.right.val)
tempArrayList.append(newnodeArrayList)
return res