501. 二叉搜索树中的众数(javascript)501. Find Mode in Binary Search Tree

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

Given the root of a binary search tree (BST) with duplicates, return all the mode(s) (i.e., the most frequently occurred element) in it.

If the tree has more than one mode, return them in any order.

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than or equal to the node’s key.
  • The right subtree of a node contains only nodes with keys greater than or equal to the node’s key.
  • Both the left and right subtrees must also be binary search trees.

示例 1:
请添加图片描述

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

解题思路
二叉树中序遍历性质:一颗二叉树的中序遍历序列是一个非递减的有序序列。我们可以发现重复出现的数字,一定是一个连续出现的

base 为当前的数字
number 为当前数字对应出现的次数
maxNumber 为出现最多的次数
answer 为出现的众数数组

首先更新 base 和 count:

  • 如果该元素和 base 相等,那么 number 自增 1;
  • 否则将 base 更新为当前数字,number 复位为 1。

然后更新 maxNumber:

  • 如果 number=maxNumber,那么说明当前的这个数字(base)出现的次数等于当前众数出现的次数,将 base 加入answer 数组;
  • 如果 number>maxNumber,那么说明当前的这个数字(base)出现的次数大于当前众数出现的次数,因此,我们需要将 maxNumber 更新为number,清空 answer 数组后将base 加入 answer 数组。

我们可以把这个过程写成一个 update 函数。这样我们在寻找出现次数最多的数字的时候就可以省去一个哈希表带来的空间消耗。

var findMode = function (root) {
    let base = 0, number = 0, maxNumber = 0, answer = []
    var getAnswer = function (value) {
        if (value === base) {
            ++number
        } else {
            number = 1
            base = value
        }
        if (number === maxNumber) {
            answer.push(base)
        } else if (number > maxNumber) {
            maxNumber = number
            answer = [base]
        }
    }
    var dfs = function (root) {
        if (!root) return
        dfs(root.left)
        getAnswer(root.val)
        dfs(root.right)
    };
    dfs(root)
    return answer
};
//中序遍历的方法
var dfs = function (root) {
        if (!root) return
        dfs(root.left)
        getAnswer(root.val)
        dfs(root.right)
    };

leetcode:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值