给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
难度:🌟🌟
示例 1:

输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
这题思路是先序遍历,对每个节点值计数,并使用 map 结构把计数保存下来,同时记录下当前出现的频率最高的节点值个数 maxCnt。
maxCnt,则更新 maxCnt,然后清空结果集,重新记录结果;maxCnt,则将当前节点值添加到结果集中;maxCnt,忽略。上述思路能解决此问题,但没有利用到二叉搜索树的结构特性。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findMode(root *TreeNode) []int {
var res []int
cntMap := make(map[int]int)
maxCnt := 0
var preorder func(node *TreeNode)
preorder = func(node *TreeNode) {
if node == nil {
return
}
cntMap[node.Val]++
cnt := cntMap[node.Val]
if cnt > maxCnt {
maxCnt = cnt
// 删除 res 中之前保存的众数
res = nil
// 添加到结果中
res = append(res, node.Val)
} else if cnt == maxCnt {
res = append(res, node.Val)
}
preorder(node.Left)
preorder(node.Right)
return
}
preorder(root)
return res
}