题:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:这个题的思路其实很简单,先把二叉树从根节点到叶子节点的所有路径找出来,然后一条路径一条路径去找符合的就行了。关键就是在找路径这个地方。由于我们不能知道这颗二叉树到底有多少条路径,所以我们得找完一条路径,就判断这条路径是否符合条件,这就关系到路径的存储问题。题目给的是ArrayList来存总的路径,那我们也用一个ArrayList来存单条路的路径。
代码:
import java.util.ArrayList;
import java.util.Iterator;
public class Solution {
private ArrayList result = new ArrayList();// 最终返回结果
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null || target == 0)
return new ArrayList<>();
FindOnePath(root, new ArrayList(), target);
return result;
}
// 寻路函数
public void FindOnePath(TreeNode node, ArrayList arrayList, int target){
if(node == null)
return;
arrayList.add(node.val);// 首先把当前节点的值加入list
// 如果节点的左右孩子都为空,说明为叶子结点。本条路径结束。开始判定
if(node.left == null && node.right == null){
// 这里为了速度用了迭代器
Iterator iterator = arrayList.iterator();
int sum = 0;
while (iterator.hasNext()){
sum += (Integer) iterator.next();
}
if(sum == target){
// 如果满足条件,把list加入总list里。
// 注意list的add方法是加的引用,所以这里一定要new一个新的list
result.add(new ArrayList(arrayList));
}
} else {
// 如果不是叶子结点,继续递归往下遍历
if(node.left != null)
FindOnePath(node.left, arrayList, target);
if(node.right != null)
FindOnePath(node.right, arrayList, target);
}
// 记住因为我们是用一个list来存所有的路径,所以每寻完一层后要回退
arrayList.remove(arrayList.size()-1);
}
}
呕心沥血写出来的,转载请一定注明出处!