剑指offer 第24题 二叉树中和为某一值得路径
-给笨拙的自己解析
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
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 {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>(); //创建的是存放路径数组的数组,每一个路径都 在数组中存放。
if(root == null) { //如果根节点为空就直接返回arr
return arr;
}
ArrayList<Integer> a1 = new ArrayList<Integer>(); //存放每条路径的数组
int sum = 0; //设置一个存放和的变量
Path(root,target,arr,a1,sum);
return arr;
}
public void Path(TreeNode root, int target, ArrayList<ArrayList<Integer>> arr, ArrayList<Integer> a1, int sum) {
if(root == null) { 如果节点为空再来执行该条语句,比如叶子结点的左右节点都为空
return ; //遇到叶子节结束if语句
}
sum += root.val;
if(root.left==null&&root.left==null) { //判断是否是叶子节点,如果当前节点是叶子节点,
if(target == sum) { //判断从根节点到叶子结点的和是不是等于target的值
a1.add(root.val); //如果等于,就将当前该叶子节点添加到路径a1中,由于已经到了叶子结点,路径已经找到了
arr.add(new ArrayList<Integer>(a1)); //就将找到的这条路径添加到arr中
a1.remove(a1.size()-1); //同时节点向上退一下,退到当前节点的上一个节点,也就是根节点
}
return; //如果是叶子节点,但是和不等于target,就直接跳出if语句
}
a1.add(root.val); //如果不是叶子节点,每调用一次Path方法,每次传进的节点都要添加到路径a1数组中记录
Path(root.left, target,arr,a1, sum); //先序遍历每次都访问根节点,左子树的根节点
Path(root.right, target,arr,a1, sum); //左子树遍历完要去遍历右子树
a1.remove(a1.size()-1); //删除路径的最后一个节点,返回到当前节点的根节点
}
}
注:代码来源于牛客网账号nnnn。第一篇博客,写给自己复习看,写的不好。若有大神看到,还望见谅。有指导还望不吝赐教。
这个递归过程是:每个节点都有自己的左右孩子去递归,没删除一个尾节点,退到该节点的父节点,sum值也都随着节点的删除而删除了,它父节点保留着自己的sum。