题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
分析
如图所示,共有3条路径
从根节点依次向下搜索,将节点加入到路径序列中。
若当前节点为叶子节点,需判断路径上节点值总和是否为target
若当前节点非叶子节点,需要回退到父节点,然后走向另一个孩子。
即:上述为先序遍历过程。
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>> lists = new ArrayList<ArrayList<Integer>>();//所有满足要求的路径
ArrayList<Integer> list = new ArrayList<>();//当前路径
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return lists;
//将当前节点放入list中
list.add(root.val);
//目标值减少
target = target - root.val;
//当前为叶子节点,并且路径长度为target,即找到满足要求的路径
if(root.left==null && root.right ==null &&target ==0){
//将当前路径加入到符合题意的路径集合中
lists.add(list);
//下次再使用list中的路径时,不能破坏已经加入到路径集合中的list,所以要保存list路径
//防止后续的remove操作破坏list集合中的路径
list = new ArrayList<Integer>(list);
}
//如果不是叶子节点,继续向下遍历
if(root.left!=null)
FindPath(root.left,target);
if(root.right!=null)
FindPath(root.right,target);
//遍历完一条路径后,返回父节点之前,删除当前节点,即回退上一个节点
list.remove(list.size()-1);
return lists;
}
}