剑指offer每日一题算法题(java解法)
方便日后复习,从今天开始。
算法之行始于足下
[编程题]二叉树和为某一值的路径-- Java实现
------------------------------------------------------------------------------------------------------
题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
例如[{10,5,12,7}],22 答案为:{10,5,7},{10,12}
解题思路:
1.两个集合,一个放一次性满足的路径,一个放所有满足的路径
2.每经过root节点,把值和target减一下,满足的话就把当前路径存一下,再放进总的集合中,如果不满足,就把当前路径减去,然后再从第二个节点遍历到结束看是否满足,一直把前面节点省去,计算后面节点满不满足.
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//先创建一个存所有满足路径的集合
ArrayList<ArrayList<Integer>> listall=new ArrayList<ArrayList<Integer>>();
//创建存当前路径的集合
ArrayList<Integer> list=new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null) return listall;
list.add(root.val); //路径上每个值得加入list
target -= root.val; //计算剩下值
//当值等于目标值时and没有子节点了
if(target == 0 && root.left == null && root.right == null){
//就没有其它路径了,可以加进总集合了
listall.add(new ArrayList<Integer>(list));
}
//如果不满足上面,就继续计算子节点
FindPath(root.left, target);
FindPath(root.right, target);
list.remove(list.size()-1); //既然不满足的话list就不能有这个路劲
return listall;
}
}