这个题解使用中序遍历的方式遍历二叉搜索树,同时使用一些变量来记录当前节点的值、出现次数、最大出现次数等信息。在遍历过程中,通过比较当前节点值与上一个节点值是否相同,来判断当前节点是否为众数。如果当前节点出现次数等于最大出现次数,将当前节点值加入结果列表;如果大于最大出现次数,则更新结果列表为只包含当前节点值,并更新最大出现次数。遍历完整棵树后,结果列表中就是所有的众数。
时间复杂度: O(n)
空间复杂度: O(n)
# 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 findMode(self, root: Optional[TreeNode]) -> List[int]:
lastVal = 0 # 记录上一个节点的值
curTimes = 0 # 记录当前值出现的次数
maxTimes = 0 # 记录最大出现次数
stack = [] # 模拟递归调用的栈
res = [] # 记录结果(所有的众数)
while root is not None or len(stack) > 0:
if root is not None:
stack.append(root) # 当前节点不为空,入栈
root = root.left # 移动到左子节点
else:
root = stack.pop() # 当前节点为空,出栈
if root.val == lastVal: # 如果当前节点值与上一个节点值相同
curTimes += 1 # 当前值出现次数加1
else:
curTimes = 1 # 否则,重置当前值出现次数为1
lastVal = root.val # 更新上一个节点的值
if curTimes == maxTimes: # 如果当前值出现次数等于最大出现次数
res.append(root.val) # 将当前值加入结果列表
elif curTimes > maxTimes: # 如果当前值出现次数大于最大出现次数
res = [root.val] # 更新结果列表,只保存当前值
maxTimes = curTimes # 更新最大出现次数
root = root.right # 移动到右子节点
return res # 返回所有的众数