法一:利用二叉搜索树有序特性,中序遍历为有序数组,然后用哈希表统计频率,再将高频的众数返回即可。
法二:利用二叉搜索树特性,边遍历,边比较。
补充:如果不是二叉搜索树,而是普通二叉树,那么最直观的方法一定是把这个树都遍历了,得到有序数组。用哈希表map统计频率,把频率排个序,最后取前面高频的元素的集合。
递归法(法二):
# 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]:
maxCount = 0
count = 0
pre = None
result = []
def traversal(root: Optional[TreeNode]):
nonlocal count, maxCount, pre, result
if not root:
return
traversal(root.left)
#统计频率
if pre == None: count = 1 #第一个节点执行
elif pre.val == root.val: count += 1 #第一个节点之后的节点执行
else: count = 1 #同上
#将下一个节点给到前节点
pre = root
#统计频率,频率相等的众数Mode放进result
if count == maxCount:
result.append(root.val)
#若出现更高频的Mode,则需将之前的Mode都清除,从新插入新Mode
if count > maxCount:
maxCount = count
result.clear()
result.append(root.val)
traversal(root.right)
traversal(root)
return result
迭代法:
注意迭代法的写法:
cur = root
stack = []
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left #把左放进stack
else:
cur = stack.pop() #从stack中弹出中
#对中的操作
cur = cur.right #把右放进stack
# 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]:
maxCount = 0
count = 0
pre = None
result = []
cur = root
stack = []
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left #左
else:
#弹出中
cur = stack.pop()
#对中的操作 与递归法对中的操作一样
if pre == None: count = 1
elif pre.val == cur.val: count += 1
else: count = 1
pre = cur
if count == maxCount:
result.append(cur.val)
if count > maxCount:
maxCount = count
result.clear()
result.append(cur.val)
cur = cur.right #右
return result