35.二叉树中和为某一值的路径

输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。

从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

保证树中结点值均不小于 0。

数据范围:

树中结点的数量 [0,1000]。

样例:

给出二叉树如下所示,并给出num=22。
image
输出:[[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);
    }
}
posted @ 2025-05-27 09:35  回忆、少年  阅读(9)  评论(0)    收藏  举报