题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
/**
* 使用递归方法做的
* @param root
* @param target
* @return
*/
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
int num = 0;
if(root == null){
return lists;
}
isTargetPath(root,target,num,list,lists);
return lists;
}
/**
*
* @param node 当前节点
* @param target 目标值
* @param num 当前值
* @param list 当前整个路径
* @param lists 存储所有路径链表
*/
public void isTargetPath(TreeNode node , int target,int num, ArrayList<TreeNode> list, ArrayList<ArrayList<Integer>> lists){
if(node == null){
return ;
}
list.add(node);
num += node.val;
if(num == target && node.left == null && node.right == null){
lists.add(deepCopy(list));
return;
}
if(num < target && node.left !=null){
isTargetPath(node.left, target,num,list, lists);
list.remove(node.left);//因为链表是引用传递,所以每次都要去除上次添加的
}
if(num <target && node.right !=null){
isTargetPath(node.right, target,num,list, lists);
list.remove(node.right);//因为链表是引用传递,所以每次都要去除上次添加的
}
}
public ArrayList<Integer> deepCopy(ArrayList<TreeNode> list){
ArrayList<Integer> newList = new ArrayList<Integer>();
for(TreeNode i : list){
newList.add(i.val);
}
return newList;
}