题解 | #二叉树中和为某一值的路径(三)#

二叉树中和为某一值的路径(三)

https://www.nowcoder.com/practice/965fef32cae14a17a8e86c76ffe3131f

python3 DFS + 哈希表,双O(n)复杂度。
利用哈希表维护:从根出发的路径和 及其 对应的条数。
当前节点,如果是这样的情况:当前累加和temp - 目标和sum 在哈希表出现,则意味着出现了累加和sum,累加和sum的条数就是temp - sum的条数。如果没出现temp - sum,也就没出现sum。当前累加和同理,出现了则+1,没出现作为键写入哈希表,值为1。
(temp - sum + sum = temp,总和temp,temp-sum的条数就是sum的条数,想象一张琴的琴弦(两端都固定在一点上的),一端有多条路径和为temp-sum的路,那么自然也有同样多条路径和为sum的路,到达另一端)
理解了这个哈希表的作用,剩下就好理解了。
class Solution:
    def FindPath(self, root: TreeNode, sum: int) -> int:
        # 哈希表来记录路径和(从根)及对应条数
        # 路径和为0的有1条
        self.mp = dict()
        self.mp[0] = 1
        
        # lastsum为到上一层为止的累加和
        def dfs(root: TreeNode, sum: int, lastsum: int) -> int:
            # 空结点直接返回
            if root is None:
                return 0
            res = 0
            # 到目前结点为止的累加和
            temp = root.val + lastsum
            # 如果该累加和减去sum在哈希表中出现过,相当于减去前面的分支
            if (temp - sum) in self.mp:
                # 加上有的路径数
                res += self.mp[temp - sum]
            # 增加该次路径和
            if temp in self.mp:
                self.mp[temp] += 1
            else:
                self.mp[temp] = 1
            # 进入子结点
            res += dfs(root.left, sum, temp)
            res += dfs(root.right, sum, temp)
            # 回退该路径和,因为别的树枝不会经过这里了
            self.mp[temp] -= 1
            return res

        return dfs(root, sum, 0)


全部评论

相关推荐

渴望wlb的牛油果很...:直说卡第一学历不就行了 非得拐弯抹角
点赞 评论 收藏
分享
09-16 17:32
门头沟学院 Java
顺顺超爱学:1.熟悉Java编程语言,熟悉集合,多线程,IO,反射等核心知识,了解线程池,ThreadLocal等进阶知识; 2.熟悉Mysql数据库,熟练使用sql,熟悉索引,存储引擎,事务原理,MVCC,锁机制,了解sql优化; 3.熟悉Redis缓存,了解常见的数据类型,了解缓存常见问题及其解决方案,了解使用Redis实现的分布式锁方案; 4.熟悉Javaweb开发框架,熟悉spring,springmvc,mybatis等,了解IOC,AOP等; 5.熟悉微服务开发框架,熟悉SpringBoot,SpringCloud,包括Nacos,OpenFeign,Gateway等核心组件; 6.熟悉Rabbitmq消息队列,熟练使用消息模型,了解架构,消息可靠性,死信队列,延迟消息等;
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务