前言:
不想写
题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
测试用例:
{10,5,12,4,7},22
对应输出应该为:
[[10,5,7],[10,12]]
分析:
由题目可知,路径的定义是从二叉树的root开始往下,符合这一规则的三种遍历方式只有前序遍历。前序遍历每条可能的直到叶子节点的路径。在前序遍历的过程中,每遍历下一级节点的时候,应该将之前的节点存储起来,这样才能记得这条路径。因为是二叉树,所以每访问到一个新的节点,就有左右两种选择,可以创建两个ArrayList,分别进行对和的检验(递归这个过程)。如果符合条件,就将结果增加到一个由ArrayList构成的ArrayList结构中 。继续进行这一过程(使用递归实现),直到二叉树最后一个叶子节点。将这个由ArrayList构成的ArrayList返回即可。
源码:
递归:
import java.util.ArrayList;
import java.util.Stack;
public class Test1 {
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> paths=new ArrayList<ArrayList<Integer>>();
if(root==null) return paths;
find(paths,new ArrayList<Integer>(),root,target);
return paths;
}
public void find(ArrayList<ArrayList<Integer>> paths,ArrayList<Integer> path,TreeNode root,int target){
path.add(root.val);
if(root.left==null&&root.right==null){
if(target==root.val){
paths.add(path);
}
return;
}
ArrayList<Integer> path2=new ArrayList<>();
path2.addAll(path);
if(root.left!=null) find(paths,path,root.left,target-root.val);
if(root.right!=null) find(paths,path2,root.right,target-root.val);
}
}
}
运行测试:
运行时间:16ms
占用内存:9660k
总结:
此题重点考验了树的路径问题,只需要使用一个合适的结构把路径所经过的节点存储下来即可。这个实现是使用两个ArrayList,网上的另外一种解法是使用栈将路径记忆下来,每新进入一个节点,先将此节点入栈,如果当前节点不符合条件就将这个节点出栈。这样也是可行的。