问题描述:
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
带条件的深度搜索,从根节点往下 依次减小目标值,如果达到0且该节点是叶子节点,则证明有和为该值的路径。就把这个list添加到最终list中。
如果当前不满足最终条件,则在左子树中找,在右子树中找,最后找不到要回退一到父节点,即remove(list.size()-1)。
代码:
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>> flist = new ArrayList<ArrayList<Integer>>();
//存储当前路径
ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//达到空节点了
if(root==null){
return flist;
}
//将当前节点值加入list
list.add(root.val);
//目标值减去当前值
target = target - root.val;
//满足的最终条件
if(target == 0 && root.left == null && root.right == null){
flist.add(new ArrayList<Integer>(list)); //用new进行复制,不然引用对象没有变
}
//在左子树中找
FindPath(root.left,target);
//在右子树中找
FindPath(root.right,target);
//回退
list.remove(list.size()-1);//back
return flist;
}
}
虽然题目做起来还是没觉得很简单,但是却开始享受思考题解的过程了,算是个好的标志吧~