35.二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
保证树中结点值均不小于 0。
数据范围:
树中结点的数量 [0,1000]。
样例:
给出二叉树如下所示,并给出num=22。
输出:[[5,4,12,1],[5,6,6,5]]
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//存储所有符合条件的路径
List<List<Integer>>res = new ArrayList<>();
//存储当前路径
List<Integer>list = new ArrayList<>();
public List<List<Integer>> findPath(TreeNode root, int sum) {
//从根节点开始深度优先搜索
dfs(root,sum);
//返回所有符合条件的路径
return res;
}
public void dfs(TreeNode root,int sum){
//如果当前节点为空,直接返回
if(root==null)return;
//将当前节点加入路径
list.add(root.val);
//如果当前是叶子节点(左右子节点都为空)且当前节点的值等于剩余需要的和
if(root.val==sum&&root.left==null&&root.right==null){
//找到一条符合条件的路径,添加到结果集
//注意要新建一个ArrayList,避免后续修改影响已存储的路径
res.add(new ArrayList<>(list));
}
//递归搜索左子树,剩余需要的和减去当前节点的值
if(root.left!=null)dfs(root.left,sum-root.val);
//递归搜索右子树,剩余需要的和减去当前节点的值
if(root.right!=null)dfs(root.right,sum-root.val);
//回溯,移除当前节点,尝试其他路径
// 这是关键步骤,确保在返回上一层时可以尝试其他分支
list.remove(list.size()-1);
}
}


浙公网安备 33010602011771号