题目
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
分析
就是深度遍历二叉树的变形题,还是用递归来实现,传入值为root和target(目标值),每次递归时要更新target的值,target=target-root.val
- 引入两个ArrayList,一个ArrayList<ArrayList< Integer>>是放所有的list的,另一个ArrayList< Integer>是存放路径的。
- 深度遍历+每次递归时把target-root.val传进去
- 情况1:root=null,return
- 情况2:target<0,return
- 情况3:target=0且root为叶子结点,把当前存放路径的list加到总的list去
- 情况4:不断递归,深度遍历,每向下递归一次,就把target的值更新为target-root.val
- 注意:深度遍历都要涉及到回退,即如果已经访问到了叶子结点,还没找到的话,则要回退到当前叶子结点的根节点继续找。
代码
import java.util.ArrayList;
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); //把root结点的值加到路径里面
target = target - root.val; //同时更新target的值
if(target < 0){
return listAll;
}
if(target==0 && root.left==null && root.right==null){
把满足条件的list加到listAll里,注意add添加的是引用,不新new一个后面操作会改变list
listAll.add(new ArrayList<Integer>(list));
}
FindPath(root.left, target);
FindPath(root.right, target);
list.remove(list.size()-1); //如果遍历到叶子节点了,还没找到,则要回退到当前叶子的根节点继续找,深度遍历都有回退操作
return listAll;
}
}