赞
踩
这是树的第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
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。