Skip to content

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
};

上次更新于: