给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
思路
可以直接中序遍历,相当于得到一个顺序的数组,只要判断当前数字与前一个是否相同,相同就让当前数字的个数加一,然后判断是否达到了最大的数目,是就放入ans,超过就清空ans,放入当前最多的数。
遍历一遍即可,没有额外用很多空间。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def findMode(self, root: TreeNode) -> List[int]:
ans = []
most = 0
counts = 0
last = None
def search(t):
nonlocal ans,most,counts,last#声明外函数局部变量
if not t:#当前节点无,直接返回
return
if t.left:#遍历左子树
search(t.left)
if t.val == last:
counts+=1
else:
counts=1
if counts == most:
ans.append(t.val)
elif counts>most:
most = counts
ans = [t.val]
last = t.val
if t.right:#遍历右子树
search(t.right)
search(root)
return ans