【LeetCode】508. 出现次数最多的子树元素和

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 节点数在 [1, 104] 范围内
    • -105 <= Node.val <= 105

二、思路分析:

我们拿到本题,读取题意要求求出树中所有子树值中出现次数最多的树节点。同样,在解答题目之前,我们还需要对细节的地方进行明确:

  • 题目中给出的树类型:二叉树
  • 二叉树遍历的方式:深度遍历(dfs)和广度遍历(bfs)
  • 出现子树元素和次数最多的,因此需要使用哈希表来创建元素和与出现次数的映射关系

根据题目中举例例子1,我们进行手动演示,推理思路如下:

  • 由于不考虑node节点的先后顺序,我们直接使用深度遍历-前序遍历,根左右获取根及子节点的值
  • 定义一个默认字典,我们可以借助Counter()函数实现,遍历每一次的节点时,记录元素和和次数
  • 遍历完整个二叉树之后,我们得到一个子树元素和与次数的字典res
  • 在res.values()中求出最大值maxres
  • 最后找出次数与maxres相同的子树和,添加到列表中并返回结果

示列1的推理演示图如下所示:

image.png

我们根据上述思路,使用python实现如下:

class Solution(object):
    def findFrequentTreeSum(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        res = Counter()
        maxres = 0

        def dfs(root):
            if not root:return 0
            nodesum = root.val + dfs(root.left) + dfs(root.right)
            res[nodesum] += 1
            return nodesum
        
        dfs(root)
        maxres = max(res.values())
        return [nodenum for nodenum in res.keys() if res[nodenum] == maxres ]
复制代码

三、总结:

本题考察我们二叉树深度遍历算法,并且使用哈希表来存储子树和和次数,AC提交代码记录如下:

image.png

  • 时间复杂度O(n),n为二叉树节点数
  • 空间复杂的O(n),哈希表和递归的栈空间均为 O(n)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~

猜你喜欢

转载自juejin.im/post/7110850531966353422