LeetCode501. 二叉搜索树中的众数Golang版
1. 问题描述
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。
假定 BST 有如下定义:
结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],
2. 思路
中序遍历模板题
- 每一次遍历记录前一个节点prev
- 每一次遍历比较前一个节点和当前节点值是否相等
- 如果相等count++,不等则count = 0
- 找出最大count对应的节点。
3. 代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findMode(root *TreeNode) []int {
var res []int
if root == nil {
return res
}
var stack []*TreeNode
var pre *TreeNode
var count int
var maxCount int
for root != nil || len(stack) > 0 {
for root != nil {
stack = append(stack, root)
root = root.Left
}
pop := stack[len(stack) - 1]
if pre == nil { // 第一个节点
count = 1
} else if pre.Val == pop.Val { // 如果与前一个节点的值相同++
count++
} else { // 如果与前一个不相同
count = 1
}
// count等于maxCount: 把元素进展,因为可能存在多个众数
if count == maxCount {
res = append(res, pop.Val)
}
// count大于maxCount: 更新maxCount和res
if count > maxCount {
maxCount = count
res = res[:0]
res = append(res, pop.Val)
}
pre = pop
stack = stack[:len(stack) - 1]
root = pop.Right
}
return res
}