题目
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题思路
直接深度遍历,每次减去当前节点的值,直到叶子节点,判断val是否target,是则说明是一条路径,否则不是。
代码如下
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
//为空,直接返回
if (root == null) return new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
DFS(res, new ArrayList<Integer>(), root, target);
return res;
}
public void DFS(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> list, TreeNode root, int target) {
//到达叶子节点时,进行判断
if (root.left == null && root.right == null && target == root.val) {
list.add(root.val);
res.add(new ArrayList<>(list));
list.remove(list.size() - 1);
return;
}
//不是叶结点时,放入链表
list.add(root.val);
//深度搜索
if (root.left != null) DFS(res, list, root.left, target - root.val);
if (root.right != null) DFS(res, list, root.right, target - root.val);
//进行回溯
list.remove(list.size() - 1);
}