leetcode501. 二叉搜索树中的众数

news/2025/2/12 16:03:52/

  • 题目描述
  • 解题思路
  • 执行结果
leetcode501. 二叉搜索树中的众数


题目描述

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

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

假定 BST 满足如下定义:

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

示例 1:

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

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

提示:

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

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-mode-in-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

法1

中序遍历:
题目描述说:

结点左子树中所含节点的值 小于等于 当前节点的值

结点右子树中所含节点的值 大于等于 当前节点的值

所以在中序遍历的是否,就能够得到一个有序数组,相同的数据是在一起的,我们通过判断相同数据的个数确定该数是否为众数(个数>=最大的个数),

如果大于,之前的众数就不再是众数了,

如果等于,将次数值加到众数数组中

最后遍历完成输出众数数组

  • 时间复杂度(O(n))
  • 空间复杂度(O(n))

执行结果

法1

func inorderTraversalHelper(root *TreeNode, result *[]int) {
    if root == nil {
        return
    }
    inorderTraversalHelper(root.Left, result)
    *result = append(*result, root.Val)
    inorderTraversalHelper(root.Right, result)
}

func findMode(root *TreeNode) []int {
    a := []int{}
    inorderTraversalHelper(root, &a)
    i, j, m := 100
t := 0
    for ; i < len(a); i++ {
        if a[t] != a[i] {
            if m < i-t {
                m = i - t
                j = 1
                a[0] = a[t]
            } else if m == i-t {
                a[j] = a[t]
                j++
            }
            t = i
        }
    }
    if m < i-t {
        return []int{a[t]}
    } else if m == i-t {
        return append(a[:j], a[t])
    } else {
        return a[:j]
    }
}

执行结果: 通过 显示详情 查看示例代码 添加备注

执行用时: 8 ms , 在所有 Go 提交中击败了 83.39% 的用户 内存消耗: 5.7 MB , 在所有 Go 提交中击败了 99.45% 的用户 通过测试用例: 23 / 23

法2


法3


本文由 mdnice 多平台发布


http://www.ppmy.cn/news/44375.html

相关文章

数字孪生(1)

目前接触的客户群体是做大屏展示&#xff0c;闲鱼上5元包邮的那种科技感前端&#xff08;不好意思我买了&#xff09;各路模型大整合 实景GISiOT&#xff0c;如果再来点动画就好&#xff0c;然满屏动起来&#xff0c;火灾烧起来&#xff0c;水面荡漾起来&#xff0c;工程车开起…

【产线事故】分享生产线事故发生的一次OOM

文章目录前言OutOfMemoryError出现的原因常见堆内存溢出的几种情况现象分析Mybatis源码分析情景复现总结前言 继上次线上CPU出现了报警&#xff0c;这次服务又开始整活了&#xff0c;风平浪静了没几天&#xff0c;看生产日志服务的运行的时候&#xff0c;频繁的出现OutOfMemor…

2023年环境工程与生物技术国际会议(CoEEB 2023)

会议简介 Brief Introduction 2023年环境工程与生物技术国际会议(CoEEB 2023) 会议时间&#xff1a;2023年5月19日-21日 召开地点&#xff1a;瑞典马尔默 大会官网&#xff1a;www.coeeb.org 2023年环境工程与生物技术国际会议(CoEEB 2023)将围绕“环境工程与生物技术”的最新研…

【MySQL速通篇001】pymysql简单操作mysql数据库的方法

前言 本篇博客主要讲的是一些基础的pymysql操作mysql数据库的方法&#xff0c;如果有不足之处&#xff0c;欢迎各位指正 &#x1f340;1、pymysql.connent 用法&#xff1a;创建链接 语法&#xff1a;conn pymysql.connect(host‘127.0.0.1’, port端口号, user‘数据库用户名…

排序+双指针:高效解决数组和链表相关问题

排序和双指针是常用的算法技巧&#xff0c;它们在解决一些数组或链表相关的问题时非常有效。在本文中&#xff0c;我们将介绍如何使用排序和双指针结合起来解决一些常见的问题。 排序的基本思路是将数组或链表按照某个规则进行排序&#xff0c;然后根据排序后的顺序来解决问题…

数据结构之图(最小生成树+最短路径)

基本概念 连通&#xff1a;若a->b存在路径&#xff0c;即为连通 连通图&#xff1a;该图中任意两点均连通&#xff0c;即为连通图 连通分量&#xff1a;下图为无向图&#xff0c;但存在三个连通分量 强连通图&#xff1a;双向的连通图 强连通分量&#xff1a;有向图中的双…

linux线程调度策略

系统中既有分时调度&#xff0c;又有时间片轮转调度和先进先出调度 学习这个主要为了在linux多线程中&#xff0c;解决几条指令间延时在1-2ms内&#xff1b; 1.比如之前处理过&#xff1a;给一个板子发送一个can指令&#xff0c;接着需要给另外一个模块发送移动指令&#xff0c…

APIs --- DOM事件进阶

1. 事件流 事件流指的是事件完整执行过程中的流动路径 任意事件被触发时总会经历两个阶段&#xff1a;【捕获阶段】和【冒泡阶段】 事件捕获 概念&#xff1a;从DOM的根元素开始去执行对应的事件&#xff08;从外到里&#xff09; 捕获阶段是【从父到子】的传导过程 代码&…