声明:
今天是第117道题。给定两个没有重复元素的数组 nums1
和 nums2
,其中nums1
是 nums2
的子集。找到 nums1
中每个元素在 nums2
中的下一个比其大的值。nums1
中数字 x 的下一个更大元素是指 x 在 nums2
中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST[1,null,2,2]
,1 \ 2 / 2
返回[2]
.
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
解法1。常规思路,遍历整个二叉树,把元素及其出现频数放到字典里,结束后遍历该字典找出频数最大对应的键并返回,代码如下。
执行用时: 88 ms, 在Find Mode in Binary Search Tree的Python3提交中击败了78.53% 的用户
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution():
max_count = 0
def FindMode(self,root):
res = []
res_map = {}
if not root:
return []
self.dfs(root,res_map)
for key,value in res_map.items():
if value == self.max_count:
res.append(key)
return res
def dfs(self,root,res_map):
if not root:
return
# 中序遍历,左-根-右
self.dfs(root.left,res_map)
res_map[root.val] = res_map.get(root.val,0)+1
self.max_count = max(self.max_count,res_map[root.val])
self.dfs(root.right,res_map)