501. 二叉搜索树中的众数
程序员文章站
2022-05-20 16:14:05
...
描述
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
暴力解
- 遍历 + 统计
class Solution:
def findMode(self, root: TreeNode) -> List[int]:
c = collections.defaultdict(int)
if not root: return []
def f(root):
if root:
c[root.val] += 1
f(root.left)
f(root.right)
f(root)
m = max(c.values())
return [k for k, v in c.items() if v == m]
O(1) 空间解
- 上面的解法没有用到二叉树的性质。利用中序遍历,得到的序列是有序的。 也就是说我们在遍历的过程中, 都是先看到小的元素,然后在变大。对于一个排好序的数列, 我们可以用一个临时变量来维护众数的频数。
class Solution:
def findMode(self, root: TreeNode) -> List[int]:
if not root: return []
ret,pre,mf, fre = [], 0, 0, 0
def inorder(root):
nonlocal pre, fre, mf, ret
if not root:
if fre > mf:
ret = [pre]
elif fre == mf and (not ret or ret[-1] != pre):
ret.append(pre)
return
inorder(root.left)
if root.val == pre:
fre += 1
else:
if fre == mf and (not ret or ret[-1] != pre):
ret.append(pre)
elif fre > mf:
ret, mf = [pre], fre
pre, fre = root.val, 1
inorder(root.right)
inorder(root)
return ret
推荐阅读
-
Python实现查找二叉搜索树第k大的节点功能示例
-
Java创建二叉搜索树,实现搜索,插入,删除的操作实例
-
Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】
-
Python中的二叉树查找算法模块使用指南
-
Python利用前序和中序遍历结果重建二叉树的方法
-
Python实现查找二叉搜索树第k大的节点功能示例
-
C语言实现线索二叉树的前中后创建和遍历详解
-
荐 Java刷题笔记15:不同的二叉搜索树( Unique Binary Search Trees)
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现