1.题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
2.算法描述
实际上就是一个树的前序遍历。
1.申请两个列表容器,ans,path,ans用来放满足和为目标值的路径,path相当于一个前序遍历的辅助栈。
2.当树
时,直接返回ans;
当树
时,将根结点值root.val装入path。如果
,则说明现在path中装的是一条满足目标值的路径,将该路径装入ans,并将path的栈顶值出栈。(相当于回退到父节点,重新找下一个满足的路径);否则
。
3.代码描述
3.1.Java代码
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
//我认为单独写一个preorder函数会更有助于理解,而不是单独贪代码简洁 反而失去了更好的理解性
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
ArrayList<Integer> path = new ArrayList<>();
if(root == null)//空树 直接返回
return ans;
preorder(root, target, ans, path);开始前序遍历
return ans;
}
private void preorder(TreeNode root, int target, ArrayList<ArrayList<Integer>> ans, ArrayList<Integer> path){
path.add(root.val);
target -= root.val;
if(target==0 && root.left==null && root.right==null)//如果target在减去结点值后为0 并恰好到了叶节点 说明目标路径找到
ans.add(new ArrayList<>(path));
if(root.left!=null)
preorder(root.left, target, ans, path);
if(root.right!=null)
preorder(root.right, target, ans, path);
path.remove(path.size()-1);
}
}
3.2.Python代码
# -*- 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):
def preorder(root, expectNumber, ans, path):
path.append(root.val)
expectNumber -= root.val
if expectNumber==0 and root.left==None and root.right==None:
ans.append([p for p in path])
if root.left:
preorder(root.left, expectNumber, ans, path)
if root.right:
preorder(root.right, expectNumber, ans, path)
path.pop()
ans = []
path = []
if root==None:
return ans
preorder(root, expectNumber, ans, path)
return ans