Leetcode 437- 路径总和 III

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

在这里插入图片描述
在这里插入图片描述

题解

树的遍历 + DFS

一个朴素的做法是搜索以每个节点为根的(往下的)所有路径,并对路径总和为 targetSum 的路径进行累加统计。

使用 dfs1 来搜索所有节点,复杂度为 O(n);在 dfs1 中对于每个当前节点,使用 dfs2 搜索以其为根的所有(往下的)路径,同时累加路径总和为 targetSum 的所有路径,复杂度为 O(n)。

class Solution {
    private int res=0;
    public int pathSum(TreeNode root, int targetSum) {
        dfs1(root,targetSum);
        return res;
    }

    private void dfs1(TreeNode root, int targetSum){
        if(root==null) return;
        dfs2(root,targetSum,root.val);
        dfs1(root.left,targetSum);
        dfs1(root.right,targetSum);
    }

    private void dfs2(TreeNode root, int targetSum, int val){
        if(val==targetSum) res++;
        if(root.left!=null){
            dfs2(root.left,targetSum,val+root.left.val);
        }
       if(root.right!=null){
            dfs2(root.right,targetSum,val+root.right.val);
        }
    }
}

在这里插入图片描述

注意

1.为什么要有dfs1和dfs2,不能只有一个dfs2?
答:因为本题要求以任意一个节点为根节点作为起始节点向下搜索,dfs2可以完成从某一个节点向下搜索,而dfs1则是为了找到树中每一个节点,并将其作为起始根节点输送给dfs2。

2.为什么不可以把dfs1写到pathSum里?
答:pathSum需要返回具体的值,dfs1有时需要直接return。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值