题解 | #二叉树中和为某一值的路径#
二叉树中和为某一值的路径
http://www.nowcoder.com/practice/b736e784e3e34731af99065031301bca
java解
1.判断某一条路径上的值相加是否为target,也就是要证明子节点路径上的值相加是否等于 target-root.val,(因为不能确定每个节点上存储的到底是正数还是负数,所以每一条路径我们都必须一直判断到叶子节点),通过这一点我们可以直接递归,一直到叶子节点,到叶子节点的时候,target - root.val == 0 ,就证明这个条路径是符合要求的。
2.我认为该题目的难点不是递归去判断每个节点。而是难在如何在递归的过程中去记录每个节点,每一条路径,因为每一条路径都有可能会有很多的左右分叉。
这里记录每一条路径的方法,我是这样解决的:首先存储每一个节点直接使用一个ArrayList list,当遇到了某一个节点有左节点时,就新建一个list 的拷贝listClone,递归左节点的时候就在listClone中去进行记录每个节点,递归右节点的时候在直接在list中去记录。
import java.util.*;
/**
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>> arrayList = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null) return arrayList;
Find(root,target,new ArrayList<Integer>());
return arrayList;
}
public void Find(TreeNode root,int target,ArrayList list){
target = target - root.val;
list.add(root.val);
if(root.left == null && root.right == null ){
if( target == 0 ){
arrayList.add(list);
}
}
if(root.left != null){
ArrayList<Integer> listClone = (ArrayList)list.clone();
Find(root.left,target,listClone);
}
if(root.right != null){
Find(root.right,target,list);
}
}
}
格力公司福利 243人发布