持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 节点数在
[1, 104]
范围内 -105 <= Node.val <= 105
- 节点数在
二、思路分析:
我们拿到本题,读取题意要求求出树中所有子树值中出现次数最多的树节点。同样,在解答题目之前,我们还需要对细节的地方进行明确:
- 题目中给出的树类型:二叉树
- 二叉树遍历的方式:深度遍历(dfs)和广度遍历(bfs)
- 出现子树元素和次数最多的,因此需要使用哈希表来创建元素和与出现次数的映射关系
根据题目中举例例子1,我们进行手动演示,推理思路如下:
- 由于不考虑node节点的先后顺序,我们直接使用深度遍历-前序遍历,根左右获取根及子节点的值
- 定义一个默认字典,我们可以借助Counter()函数实现,遍历每一次的节点时,记录元素和和次数
- 遍历完整个二叉树之后,我们得到一个子树元素和与次数的字典res
- 在res.values()中求出最大值maxres
- 最后找出次数与maxres相同的子树和,添加到列表中并返回结果
示列1的推理演示图如下所示:
我们根据上述思路,使用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提交代码记录如下:
- 时间复杂度O(n),n为二叉树节点数
- 空间复杂的O(n),哈希表和递归的栈空间均为 O(n)
以上是本期内容,欢迎大佬们点赞评论,下期见~~~