给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
#最直观的思路
# 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: TreeNode) -> List[int]:
res = []
pre = float('-inf')
count = 0
max_count = 0
# def mid(root):
# nonlocal res, pre, count, max_count
# if not root:
# return
# mid(root.left)
# if root.val == pre:
# count += 1
# else:
# count = 1
# if count == max_count:
# res.append(root.val)
# elif count > max_count:
# res = [root.val]
# max_count = max(max_count, count)
# pre = root.val
# mid(root.right)
# mid(root)
# return res
stack = []
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
if root.val == pre:
count += 1
else:
count = 1
if count == max_count:
res.append(root.val)
elif count > max_count:
res = [root.val]
max_count = max(count, max_count)
pre = root.val
root = root.right
return res