import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
import static java.lang.System.out;
/**
* 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
* Created by ZeHua on 2017/5/16.
*/
public class FindPathInTree {
ArrayList<ArrayList<Integer>> out_routes = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)return out_routes;
LinkedList<Integer> route_list = new LinkedList<>();//记录当前路径
printFindPath(root,target,root.val,route_list);
return out_routes;
}
public void printFindPath(TreeNode curNode,int target,int sum_val,LinkedList<Integer> route_list){
if(curNode==null){//到达叶节点
if(sum_val==target){//若二叉树中结点值的和为输入整数,打印路径
ArrayList<Integer> route = new ArrayList<>();
//把route_list路径复制到route中
Iterator<Integer> nodes= route_list.iterator();
while (nodes.hasNext()){
route.add(nodes.next());
}
out_routes.add(route);
}
//返回前弹出过期路径节点
route_list.pollLast();
return;
}
route_list.addLast(curNode.val);//每次调用printFindPath都把当前结点值加到路径列表中
int left_val = 0;
if(curNode.left!=null){
left_val = curNode.left.val;
}
printFindPath(curNode.left,target,sum_val+left_val,route_list);
if(curNode.right==null){//防止加入同一路径两次
return;
}
printFindPath(curNode.right,target,sum_val+curNode.right.val,route_list);
//返回前弹出过期路径节点
route_list.pollLast();
return;
}
public static void main(String[] args) {
int[] a1 = {10,5,12,4,7};
int[] a2 = {8,9,2};
TreeNode t1 = Array2BinTree.array2BinTree(a1);
TreeNode t2 = Array2BinTree.array2BinTree(a2);
out.println(new FindPathInTree().FindPath(t1,22));
}
}
【算法-java】打印出二叉树中结点值的和为输入整数的所有路径
最新推荐文章于 2023-09-14 23:23:34 发布