这是树的第30篇算法,力扣链接。
给你一个含重复值的二叉搜索树(BST)的根节点
root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
示例 1:
输入:root = [1,null,2,2] 输出:[2]
思路可以试试先前序遍历将数字计数,然后遍历map取出来放入到result里面。
func findMode(root *TreeNode) []int {
var result []int
if root == nil {
return result
}
numCount := make(map[int]int)
node := root
stack := []*TreeNode{root}
max := 0
for len(stack) > 0 {
for node != nil {
numCount[node.Val]++
if max < numCount[node.Val] {
max = numCount[node.Val]
}
stack = append(stack, node)
node = node.Left
}
node = stack[len(stack)-1].Right
stack = stack[:len(stack)-1]
}
for num, count := range numCount {
if count == max {
result = append(result, num)
}
}
return result
}
当然,也可以中序遍历获取有序数组,然后处理数字的方式找众数。
func findMode(root *TreeNode) (answer []int) {
var base, count, maxCount int
update := func(x int) {
if x == base {
count++
} else {
base, count = x, 1
}
if count == maxCount {
answer = append(answer, base)
} else if count > maxCount {
maxCount = count
answer = []int{base}
}
}
var dfs func(*TreeNode)
dfs = func(node *TreeNode) {
if node == nil {
return
}
dfs(node.Left)
update(node.Val)
dfs(node.Right)
}
dfs(root)
return
}