1. 本题知识点
树
2. 题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
下面的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12
10
/ \
5 12
/ \
4 7
3. 解题思路
编写函数如下:
- 如果当前结点为空,直接返回
- 将当前结点加入路径
- 如果当前路径结点值的和小于输入整数
- 递归当前结点的左子树
- 递归当前结点的右子树
- 如果当前路径结点值的和等于输入整数,且该结点为叶结点
- 添加该路径
- 将当前路径最后一个结点删除
4. 代码
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
// 所有路径
private ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
/**
* 输入一颗二叉树的根节点和一个整数,
* 按字典序打印出二叉树中结点值的和为输入整数的所有路径。
* 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
*
* @param root
* @param target
* @return
*/
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
FindPath(root, new ArrayList<Integer>(), target);
return lists;
}
public void FindPath(TreeNode root, ArrayList<Integer> list, int target) {
// 如果当前结点为空,直接返回
if (root == null) {
return;
}
// 计算当前路径结点值的和
int sum = 0;
for (Integer value : list) {
sum += value;
}
// 将当前结点加入路径
list.add(root.val);
// 如果当前路径结点值的和小于 target
if (sum + root.val < target) {
// 递归当前结点的左子树
FindPath(root.left, list, target);
// 递归当前结点的右子树
FindPath(root.right, list, target);
}
// 如果当前路径结点值的和等于 target,且该结点为叶结点
if (sum + root.val == target && root.left == null && root.right == null) {
// 添加该路径
lists.add(new ArrayList<>(list));
}
// 将当前路径最后一个结点删除
list.remove(list.size() - 1);
}
}