给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
解题思路:
这道题的核心思路是通过DFS遍历二叉搜索树,统计每个节点值的出现频率,然后从中找到频率最高的值。由于二叉搜索树的性质,节点值是唯一的,因此通过这种遍历方法能够有效地统计每个值的频率,并最终找到众数。
完整代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
from collections import defaultdict
class Solution:
def searchBST(self, cur, freq_map):
if cur is None:
return
freq_map[cur.val] += 1 # 统计元素频率
self.searchBST(cur.left, freq_map)
self.searchBST(cur.right, freq_map)
def findMode(self, root):
freq_map = defaultdict(int) # key:元素,value:出现频率
result = []
if root is None:
return result
self.searchBST(root, freq_map)
max_freq = max(freq_map.values())
for key, freq in freq_map.items():
if freq == max_freq:
result.append(key)
return result
导入了defaultdict
类,它是Python标准库collections
模块中的一个数据结构。
def searchBST(self, cur, freq_map):
if cur is None:
return
freq_map[cur.val] += 1 # 统计元素频率
self.searchBST(cur.left, freq_map)
self.searchBST(cur.right, freq_map)
- 检查当前节点是否为空 (
None
)。如果是空的,则直接返回,不做任何操作(递归的基准条件)。 - 如果当前节点不为空,获取该节点的值并在
freq_map
中增加其出现频率(即freq_map[cur.val] += 1
)。 - 递归地调用
searchBST
方法,遍历当前节点的左子节点和右子节点。
def findMode(self, root):
freq_map = defaultdict(int) # key:元素,value:出现频率
result = []
if root is None:
return result
self.searchBST(root, freq_map)
max_freq = max(freq_map.values())
for key, freq in freq_map.items():
if freq == max_freq:
result.append(key)
return result
- 初始化一个
defaultdict
,用于存储每个节点值的出现频率(freq_map = defaultdict(int)
)。 - 初始化一个空列表
result
,用于存储最终结果,即众数。 - 如果根节点为空,则直接返回空列表
result
。 - 调用
searchBST
方法,对整棵树进行遍历,并记录每个节点值的频率。 - 找出
freq_map
中出现频率的最大值,即max_freq
。 - 遍历
freq_map
,将所有频率等于max_freq
的节点值添加到result
中。 - 返回
result
,其中包含了树中所有的众数。