题目:输入一个二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径,从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
分析:由于路径是从根结点出发到叶子结点,所以首先要遍历根结点,即前序遍历。规律是,前序遍历访问某个结点,把该结点添加到路径上,并累加该结点的值,如果该结点为叶子结点并且路径中节点的值的和刚好等于输入的整数,则当前路径符合要求。如果当前结点不是叶子结点则继续访问它的子节点。当前结点访问结束后,递归函数将自动回到它的父结点,因此在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到父结点的路径。
import java.util.*;
public class wr25findPath {
public static ArrayList<ArrayList<Integer>> findPath(TreeNode root, int target){
ArrayList<ArrayList<Integer>> paths=new ArrayList<>();
if(root==null){
return paths;
}
find(paths,new ArrayList<Integer>(),root,target);
return paths;
}
public static 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和path相等,分别负责right和left分支的递归
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);
}
}
public static void main(String []args){
TreeNode root=new TreeNode(10);
root.left=new TreeNode(5);
root.right=new TreeNode(12);
root.left.left=new TreeNode(4);
root.left.right=new TreeNode(7);
ArrayList<ArrayList<Integer>> paths=findPath(root,22);
for(int i=0;i<paths.size();i++){
ArrayList<Integer> list=paths.get(i);
for(int j:list){
System.out.print(j+" ");
}
System.out.println();
}
}
}