题目:
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
保证树中结点值均不小于 0。
<p>
数据范围
树中结点的数量 [0,1000]。
给出二叉树如下所示,并给出num=22。
5
/ \
4 6
/ / \
12 13 6
/ \ / \
9 1 5 1
<p>
输出:[[5,4,12,1],[5,6,6,5]]
package algorithm;
import java.util.ArrayList;
import java.util.List;
/**
* @Author liuxz
* 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径
* 从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
* 保证树中结点值均不小于 0。
* <p>
* 数据范围
* 树中结点的数量 [0,1000]。
* 给出二叉树如下所示,并给出num=22。
* 5
* / \
* 4 6
* / / \
* 12 13 6
* / \ / \
* 9 1 5 1
* <p>
* 输出:[[5,4,12,1],[5,6,6,5]]
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
private static List<List<Integer>> ans = new ArrayList<>();
private static List<Integer> path = new ArrayList<>();
public static List<List<Integer>> findPath(TreeNode root, int sum) {
dfs(root, sum);
for (List<Integer> an : ans) {
System.out.println(an);
}
return ans;
}
public static void dfs(TreeNode root, int sum) {
if (root == null) {
// 空树
return;
}
// 当前遍历结点
path.add(root.val);
// 将sum减去当前结点值
sum -= root.val;
if (root.left == null && root.right == null && sum == 0) {
// 进入循环内部说明:遍历到叶子结点,且满足路径之和等于sum
// 引用调用,需要复制path内容,不然存在ans中的为引用
List<Integer> tmp = new ArrayList<>();
tmp.addAll(path);
ans.add(tmp);
}
// 递归遍历左子树
dfs(root.left, sum);
// 递归遍历右子树
dfs(root.right, sum);
// 遍历过的叶子结点,将其删除,后继续遍历下一叶子结点
path.remove(path.size() - 1);
}
public static void main(String[] args) {
TreeNode node41 = new TreeNode(9);
TreeNode node42 = new TreeNode(1);
TreeNode node43 = new TreeNode(5);
TreeNode node44 = new TreeNode(1);
TreeNode node31 = new TreeNode(12);
node31.left = node41;
node31.right = node42;
TreeNode node32 = new TreeNode(13);
TreeNode node33 = new TreeNode(6);
node33.left = node43;
node33.right = node44;
TreeNode node21 = new TreeNode(4);
node21.left = node31;
TreeNode node22 = new TreeNode(6);
node22.left = node32;
node22.right = node33;
TreeNode node11 = new TreeNode(5);
node11.left = node21;
node11.right = node22;
findPath(node11, 22);
}
}