「LeetCode题解」剑指offer34.二叉树中和为某一值的路径

251 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目描述

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

注意:叶子节点 是指没有子节点的节点。

思路分析

  1. 对树进行一次遍历,在遍历时记录从根节点到当前节点的路径和,以防止重复计算。
  2. 本文使用深度优先搜索进行解答,也可以使用广度优先搜索,时间复杂度均为O(n^2)
  3. 代码思路(套路):
    • 不断往下一层进行遍历;
    • 在进行下一次遍历之前,做判断,如果满足条件,添加结果;
    • 然后做下一步的选择,如何能够到达下一层;
    • 在遍历之后,撤销选择
  4. 其他问题以注释的形式标注在代码中

AC 代码

class Solution {
    // 记录结果
    public List<List<Integer>> ans = new ArrayList<>();
    // 存储路径
    public List<Integer> list = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int target) {
        // 注意这里不需要进行判断,因为结点值有可能是负数
        // if(target == 0) return ans; ❎

        // 从根节点进行遍历
        dfs(root,0,target);
        return ans;
    }
    public void dfs(TreeNode node,int sum,int target){
        // base case 
        if(node == null) return;
        // 添加结点,重新计算num值
        list.add(node.val);
        sum = sum + node.val;
        // 如果满足条件,则把路径加入
        if(node.left == null && node.right == null && sum == target){
            ans.add(new ArrayList<>(list));
            // 注意这里不能return,因为后面还需要把当前结点移除,进行下一次遍历 ❎
        }
        // 继续遍历左右节点
        dfs(node.left, sum, target);
        dfs(node.right, sum, target);
        // 遍历完成后,移除队列中的最后一个结点,也就是本节点
        list.remove(list.size() - 1);
    }
}