给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-mode-in-binary-search-tree
例:
输入:root = [1,null,2,2] 输出:[2]
解析:由题可知,左子树必须小于等于根节点,右子树必须大于等于根节点,如果为众数,必然为相邻节点,若根节点和左儿子相同,那么左儿子的右儿子只能和根节点相同。同理,若根节点和右儿子相同,那么右儿子的左儿子只能和根节点相同。
# 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
class Solution:
def __init__(self):
self.pre = TreeNode() # 前置节点
self.maxcount = 0 # 当前最大计数
self.result = [] # 结果池
self.count = 0 # 当前计数
def findMode(self, root: Optional[TreeNode]) -> List[int]:
if not root: # 判空
return self.result
self.dfs(root) # 遍历
return self.result # 返回结果
def dfs(self, cur): # 遍历函数
if not cur: # 判空
return None
self.dfs(cur.left) # 左子树
if not self.pre: # 没有前置节点
self.count = 1 # 当前节点为第一个
elif self.pre.val == cur.val: # 存在前置节点且相同
self.count += 1 # 计数加1
else: # 存在前置节点但不同
self.count = 1 # 计数从1开始
if self.count == self.maxcount: # 当前计数等于最大计数
self.result.append(cur.val) # 添加到结果中
if self.count > self.maxcount: # 当前计数大于最大计数
self.maxcount = self.count # 更新最大计数
self.result = [cur.val] # 清空结果列表,存入当前节点的值
self.pre = cur # 更新前置节点
self.dfs(cur.right) # 右子树