501 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值 结点右子树中所含节点的值 大于等于 当前节点的值 左子树和右子树都是二叉搜索树
题解
本题也是二叉搜索树的中序遍历的应用,难点在于怎么记录最大的次数,以及当前的次数。如果有相同的众数还需要同时记录下所有。
我们可以定义四个变量
- currentNodeValue 当前正在记录的节点值
- currentNodeCount 当前节点值的数量
- maxNodeCount 最大节点数量
- finalResult 最终结果
javascript
let currentNodeValue = null
let currentNodeCount = 0
let maxNodeCount = 0
let finalResult = []
处理流程,当当前值和currentNodeValue相同,更新currentNodeCount,否则当前值只可能大于当前值,那么此种情况下,需要更新 currentNodeValue 和 currentNodeCount
然后判断currentNodeCount 和 maxNodeCount,如果相等,只需要将当前值放入结果中,如果currentNodeCount 大于 maxNodeCount,那么需要将结果清空,将当前值放入结果中,同时更新 maxNodeCount。
javascript
var findMode = function (root) {
let currentNodeValue = null
let currentNodeCount = 0
let maxNodeCount = 0
let finalResult = []
var middleOrder = function (root) {
if (!root) {
return
}
middleOrder(root.left)
handleMiddleNode(root)
middleOrder(root.right)
}
var handleMiddleNode = function (root) {
//console.log('fff', root, currentNodeCount, currentNodeValue, maxNodeCount, finalResult)
if (currentNodeValue === null) {
//第一次进入
currentNodeValue = root.val
}
if (root.val > currentNodeValue) {
// 值比当前记录的值大,更新现在的指针
currentNodeCount = 1
currentNodeValue = root.val
} else {
currentNodeCount++
}
//console.log('fff', root, currentNodeCount, currentNodeValue, maxNodeCount, finalResult)
if (currentNodeCount > maxNodeCount) {
//清空并记录当前最大值
finalResult = [currentNodeValue]
maxNodeCount = currentNodeCount
} else if (currentNodeCount === maxNodeCount) {
finalResult.push(currentNodeValue)
}
}
middleOrder(root)
//console.log(finalResult)
return finalResult
};