501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值
小于等于当前节点的值 - 结点右子树中所含节点的值
大于等于当前节点的值 - 左子树和右子树都是二叉搜索树
示例 1:

输入:root = [1,null,2,2]
输出:[2]
示例 2:
输入:root = [0]
输出:[0]
提示:
- 树中节点的数目在范围 [1, 10^4] 内
- -10^5 <= Node.val <= 10^5
进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)
解题思路
本人另一篇博客详解该题:https://blog.youkuaiyun.com/YouMing_Li/article/details/142621400
Go代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findMode(root *TreeNode) []int {
// 中序遍历二叉搜索树的结果就是有序的,相同数字会同时连续出现
if root == nil {
return nil
}
var prevTreeNode *TreeNode // 记录前一个节点
curTreeNode := root // 当前遍历的节点
var maxCount int // 当前为止众数的最大次数
var curCount int // 当前数字出现的次数
var res []int // 存放结果
// 迭代法的中序遍历
stack := make([]*TreeNode,0)
for curTreeNode != nil || len(stack) != 0 {
if curTreeNode != nil {
stack = append(stack,curTreeNode)
curTreeNode = curTreeNode.Left // 左
} else {
curTreeNode = stack[len(stack) - 1]
stack = stack[0:len(stack) - 1]
// 中 处理逻辑
// 没有前节点,则当前节点是第一个节点,计数为1
if prevTreeNode == nil {
curCount = 1
} else if curTreeNode.Val == prevTreeNode.Val {
curCount++
} else { // 和前一个节点不同了
curCount = 1
}
// 当前数也是众数
if curCount == maxCount {
res = append(res,curTreeNode.Val)
} else if curCount > maxCount { // 当前数是最新的众数
res = make([]int,0) // 清空之前的所有众数,因为那些都不是最终的众数
res = append(res,curTreeNode.Val)
maxCount = curCount // 更新最新众数频率
}
prevTreeNode = curTreeNode //更新前一个节点
curTreeNode = curTreeNode.Right // 右
}
}
return res
}

619

被折叠的 条评论
为什么被折叠?



