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

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

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)


全部评论

相关推荐

点赞 评论 收藏
分享
Lorn的意义:你这种岗位在中国现在要么牛马天天加班,要么关系户进去好吃好喝,8年时间,真的天翻地覆了,对于资本来说你就说一头体力更好的牛马,哎,退伍没有包分配你真的亏了。
点赞 评论 收藏
分享
06-26 17:24
已编辑
宁波大学 golang
迷失西雅图:别给,纯kpi,别问我为什么知道
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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