输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
List<List<Integer>> allList = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
if (root == null) {
return null;
}
path(root, sum, new ArrayList<Integer>());
return allList;
}
private void path(TreeNode treeNode, int sum, List<Integer> path) {
if (treeNode == null) {
return;
}
path.add(treeNode.val);
sum = sum - treeNode.val;
if (sum == 0 && treeNode.left == null && treeNode.right == null) {
allList.add(new ArrayList<>(path));
} else {
path(treeNode.left, sum, path);
path(treeNode.right, sum, path);
}
// 这里做remove的目的,是当一条路径不正确的时候,将最后一个从后往前进行remove
// 将添加到该路径的元素进行反向清空
// 这是因为整个递归过程都是用的同一个List存储路径,所以当发现不正确,就需要重新找路径
// 就需要把不正确的这个元素清除,否则会影响List集合中的元素
path.remove(path.size() - 1);
}
网友评论