题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
核心代码实现
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
//给出根节点root和一个整数target,找出满足从根节点到叶子节点和为target的所有路径
public class Solution {
ArrayList<ArrayList<Integer>> list = new ArrayList<>(); //list是所有路径的集合
ArrayList<Integer> path = new ArrayList<>(); //path是指某条路径
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null){
return list;
}
VerifyOfPath(root, target);
return list;
}
public void VerifyOfPath(TreeNode root, int target){
//判断思想:加入一个节点就做减法,直到最后减为0;故在root非空时先将root.val加path
path.add(root.val);
//终止条件:差值为0且到了树的叶子节点
if(root.val == target && root.left == null && root.right == null){
list.add(new ArrayList(path));//ArrayList引用传递,更新path后不会影响原来的path
}
//若当前根节点的左子树非空,递归检查从左子树的根到叶子节点形成的路径的和是否为target-root.val
if(root.left != null){
VerifyOfPath(root.left, target - root.val);
}
//若当前根节点的右子树非空,同理递归检查右子树
if(root.right != null){
VerifyOfPath(root.right, target - root.val);
}
//当不满足root.val==target时将最后添加的节点去掉,然后返回
path.remove(path.size()-1);
return;
}
}