501. 二叉搜索树中的众数 简单
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
- 结点左子树中所含结点的值小于等于当前结点的值
- 结点右子树中所含结点的值大于等于当前结点的值
- 左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
1
\
2
/
2
返回[2].
提示:如果众数超过1个,不需考虑输出顺序
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
代码参考:
package main
import "fmt"
func main() {
root := &TreeNode{Val: 1}
root.Right = &TreeNode{Val: 2}
root.Right.Left = &TreeNode{Val: 2}
// 1
// \
// 2
// /
// 2
fmt.Println(findMode(root)) // 2
}
// 辣鸡解法是将二叉树随便遍历到计数 map 后,两次遍历求众数即可
// cool solution // 理解本质
func findMode(root *TreeNode) []int {
var res []int
var cur, count, max int
traverseBST(root, &cur, &count, &max, &res)
return res
}
// 既然是 BST,那就中序遍历取出有序序列,一边遍历一边比较并取众数
func traverseBST(root *TreeNode, cur, count, max *int, res *[]int) {
if root == nil {
return
}
traverseBST(root.Left, cur, count, max, res)
if root.Val != *cur {
*cur = root.Val // 新值
*count = 1
} else {
*count++
}
// 新众数纪录
if *count > *max {
*max = *count
*res = nil // 重来
}
// 符合众数条件
if *count == *max {
*res = append(*res, root.Val)
}
traverseBST(root.Right, cur, count, max, res)
}
最后编辑: kuteng 文档更新时间: 2021-06-05 10:16 作者:kuteng