题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:这个题目对我还是挺难的,刚开始没有理解好题目 的意思,搞了很久,没有搞出来,后面才发现是自己把题目理解错,题目大概的意思就是“从根节点到叶子节点每一条路径经过的节点值和等于题目所给的数值”。我知道这个是dfs深度搜索,关于dfs类似的题目,大一acm的时候,做了挺多的,可能隔了一年,我忘记了。这个题目没有做出来,后面借鉴了别人的实现代码的思路之后,明白了很多。
1、我参与先序遍历的方法来遍历二叉树,递归的思路。
2、深度搜索就是每一次遍历到最深处,如果符合条件就把这一条路径存起来,以便结果的返回。如果不符合就返回上一个节点,走另外一条路。这个题目,就是按照先序遍历方式规定顺序,先遍历根节点,然后遍历左节点,然后右节点。
3、每遍历一个节点,判断是否节点之和等于目标值,如果该值为目标值并且到了叶子节点,那么就是对的路径。
具体看代码,这个思路表达起来还是挺难的。
代码:
java
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>> pathlist=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> path=new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return pathlist;
path.add(root.val);
if(root.left!=null&&root.val<target){
FindPath(root.left, target-root.val);
}
if(root.right!=null&&root.val<target){
FindPath(root.right, target-root.val);
}
if(root.left==null&&root.right==null&&target==root.val){
//pathlist.add(path);//注意这样子写是错的,因为后面有pop()会吧所有的节点放点,所以才放数组。
pathlist.add(new ArrayList<Integer>(path));
}
path.remove(path.size()-1);
return pathlist;
}
}
js:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
var path=[];
var pathlist=[];
function FindPath(root, target)
{
path=[];
pathlist=[];
findpath(root,target);
return pathlist;
// write code here
}
function findpath(root, target){//如果不重新设立一个函数,第一次测试的结果就会一直保持在pathlist数组中,所以才会重新搞一个函数,方便清空。
if(root==null)
return pathlist;
path.push(root.val);
if(root.left!=null&&root.val<target){
findpath(root.left, target-root.val);
}
if(root.right!=null&&root.val<target){
findpath(root.right, target-root.val);
}
if(root.left==null&&root.right==null&&target==root.val){
pathlist.push(path.slice(0,path.length));
}
path.pop();
return pathlist;
}
注意:代码中的注释都是自己犯过的错误,要特别注意。