6.19二叉搜索树中的众数

news2024/11/24 3:14:52

算法:

提到二叉搜索树,一定是中序遍历!

双指针法:

pre指向当前节点cur的前一个节点,如果cur.val= pre.val,count++,count用来统计该数值出现的频率

如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中。

万一,这个maxCount此时还不是真正最大频率呢。

频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。

调试过程:

原因:

在Java中,`resList[i]` 是不合法的语法,因为`ArrayList`并不支持通过索引直接访问元素。相反,它使用 `get` 方法来获取特定索引处的元素,因此正确的语法是 `resList.get(i)`

数组(Array)支持通过索引直接访问元素,因此可以使用 `res[i]` 来访问数组中的元素。但是对于列表(ArrayList)来说,需要使用 `get` 方法来访问特定索引处的元素。

因此,正确的写法是 `res[i] = resList.get(i);

而且,res没有初始化、定义

修改后:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //定义全局变量
    ArrayList reslist;
    int count;
    int maxcount;
    TreeNode pre;
    public int[] findMode(TreeNode root) {
        reslist = new ArrayList<>();
        count = 0;
        maxcount = 0;
        pre = null;
        int[] res = new int[reslist.size()];
        traversal(root);
        for (int i=0; i<reslist.size(); i++) {
            res[i] = reslist.get(i);
        }
        return res;
    }
    public void traversal(TreeNode node){
        if (node == null) return;
        //左
        if (node.left != null) traversal(node.left);
        //中
        if (pre == null || pre.val != node.val) {
            count = 1;
        }
        else {
            count++;
        }
        if (count > maxcount) {
            reslist.clear();
            maxcount = count;
            reslist.add(node.val);
        }
        else if (count == maxcount) {
            reslist.add(node.val);
        }
        pre = node;
        //右
        if (node.right != null) traversal(node.right);
    }
}

原因:

问题出在 `ArrayList reslist` 的定义上。在 Java 中,如果你没有指定泛型类型,`ArrayList` 默认会将其元素视为 `Object` 类型。因此,在 `int[] res = new int[reslist.size()];` 这一行中,你创建了一个大小为 0 的 int 数组,因为此时 `reslist` 中还没有添加任何元素。

为了解决这个问题,你应该明确定义 `ArrayList` 的元素类型为 `Integer`,而不是使用默认的 `Object`

修改后:

原因:

问题出在创建结果数组 `res` 的时候。在 `int[] res = new int[reslist.size()];` 这一行代码之后立即调用了 `traversal(root);`,这会导致 `res` 数组的大小仍然为0,因为此时 `reslist` 中还没有添加任何元素。

为了解决这个问题,应该将 `int[] res = new int[reslist.size()];` 放在 `traversal(root);` 之后。这样,当 `traversal` 方法执行完毕后,`reslist` 中会包含所有的结果,然后你才能创建相应大小的 `res` 数组,并将结果放入其中。

正确代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //定义全局变量
    ArrayList<Integer> reslist;
    int count;
    int maxcount;
    TreeNode pre;
    public int[] findMode(TreeNode root) {
        reslist = new ArrayList<>();
        count = 0;
        maxcount = 0;
        pre = null;
        
        traversal(root);
        int[] res = new int[reslist.size()];
        for (int i=0; i<reslist.size(); i++) {
            res[i] = reslist.get(i);
        }
        return res;
    }
    public void traversal(TreeNode node){
        if (node == null) return;
        //左
        if (node.left != null) traversal(node.left);
        //中
        if (pre == null || pre.val != node.val) {
            count = 1;
        }
        else {
            count++;
        }
        if (count > maxcount) {
            reslist.clear();
            maxcount = count;
            reslist.add(node.val);
        }
        else if (count == maxcount) {
            reslist.add(node.val);
        }
        pre = node;
        //右
        if (node.right != null) traversal(node.right);
    }
}

注意:

结果集是ArrayList,要转变成数组。(题目里面的输出结果是数组)

原始的 `reslist` 是一个 ArrayList,它可以动态增长,但在返回结果时,通常更方便将其转换为固定大小的数组。这样做可以更好地符合函数的返回类型,并且更方便在其他地方使用结果。

时间空间复杂度

时间复杂度分析

  • 在遍历二叉树的过程中,对于每个节点,我们执行了常数次操作(比较、更新计数器、添加到结果列表等)。
  • 假设树中有 (n) 个节点,则时间复杂度为 (O(n)),因为我们对每个节点只进行了常数次操作。

空间复杂度分析

  • 空间复杂度取决于递归调用的深度,即树的高度。在最坏的情况下,如果树是一个链状结构,递归调用的深度将是 (O(n))。
  • 此外,我们使用了一个 ArrayList 来存储结果,其空间占用与树中节点个数相关,因此空间复杂度也是 (O(n))。

算法的时间复杂度为 (O(n)),空间复杂度也是 (O(n))。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交付《啤酒游戏经营决策沙盘》的项目

感谢首富客户连续两年的邀请&#xff0c;交付《啤酒游戏经营决策沙盘》的项目&#xff0c;下周一JSTO首席学习官Luna想让我分享下系统思考与投资理财&#xff0c;想到曾经看过的一本书《深度思维》&#xff0c;看到一些结构来预判未来。不仅仅可以应用在企业经营和组织发展上&a…

tomcat篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、Tomcat是什么?二、什么是Servlet呢?三、什么是Servlet规范?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、To…

【Fastadmin】利用 build_select 做一个树状下拉选择框

1.效果展示 系统crud生成的下拉分类有些不是很好看&#xff0c;并且选择困难&#xff0c;看不出级差&#xff0c;效果如下&#xff1a; 经过 build_select 加工后的效果,美观好看&#xff0c;并添加上搜索功能: 2. 首先需要写一个树状图的数据格式 protected $datalist []; pu…

科学指南针走进江南大学,探索科研绘图与3D Max软件应用的精彩世界

2023年11月23日&#xff0c;江南大学迎来了一场精彩的科学指南针线下讲座&#xff0c;该讲座以探索科研绘图与3D Max软件应用为主题&#xff0c;通过专家讲座和实践操作&#xff0c;帮助学生了解科研绘图的重要性和3D Max软件在科研领域的广泛应用&#xff0c;吸引了大量感兴趣…

不一样的年会彩瞳推荐,绮芙莉多款彩瞳彰显个性

临近年底&#xff0c;各种公司年会、跨年晚会活动也逐渐排上日程&#xff0c;出席这种正式场合&#xff0c;每个人都有自己的“杀手锏”&#xff0c;从发型妆容到穿搭都是变美小细节&#xff0c;作为心灵之窗的双眸&#xff0c;更需要一副彩瞳来提升我们的眼妆质感&#xff0c;…

《树莓派不吃灰》第二十四期:懒是第一生产力,为树莓派安装可视化开源管理面板1Panel

最近有哥们推荐了一个现代化Linux开源管理面板1Panel&#xff0c;开源且稳定&#xff0c;懒是第一生产力&#xff0c;虽然命令行很灵活&#xff0c;但图形化界面真的是懒人刚需&#xff0c;本期在树莓派部署一下1Panel&#xff0c;让树莓派Linux运维更省力&#xff0c;进一步降…

主存储器与CPU的连接

目录 一. 单块存储芯片与CPU的连接二. 多块存储芯片与CPU的连接2.1 位扩展2.2 字扩展2.3 字位扩展 三. 译码器知识点的补充 \quad 一. 单块存储芯片与CPU的连接 \quad \quad \quad 暴露出的引脚都是与CPU连接的 上面这个是88位的存储芯片 我们可以看到有8个字, 每个字的字长是8…

【MATLAB源码-第99期】基于matlab的OFDM系统卡尔曼滤波(kalman)信道估计,对比LS,MMSE。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 卡尔曼滤波器&#xff08;Kalman Filter&#xff09;是一种有效的递归滤波器&#xff0c;它能够从一系列的含有噪声的测量中估计动态系统的状态。在无线通信领域&#xff0c;尤其是在正交频分复用&#xff08;OFDM&#xff0…

【人工智能Ⅰ】实验7:K-means聚类实验

实验7 K-means聚类实验 一、实验目的 学习K-means算法基本原理&#xff0c;实现Iris数据聚类。 二、实验内容 应用K-means算法对iris数据集进行聚类。 三、实验结果及分析 0&#xff1a;输出数据集的基本信息 参考代码在main函数中首先打印了数据、特征名字、目标值、目标…

【C语言】操作符详解(一):进制转换,原码,反码,补码

目录 操作符分类 2进制和进制转换 2进制转10进制 10进制转2进制 2进制转8进制和16进制 2进制转8进制 2进制转16进制 原码、反码、补码 操作符分类 操作符中有一些操作符和二进制有关系&#xff0c;我们先铺垫一下二进制的和进制转换的知识。 2进制和进制转换 其实我们经…

Java+Swing: 主界面的窗体 整理8

主界面的写法跟之前登录界面的窗体写法大致相同&#xff0c;在主界面中主要是窗体的大小的设置 package com.student_view;import com.utils.DimensionUtil; import sun.applet.Main;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author&#xff1a;xie…

基于STM32 + DMA介绍,应用和步骤详解(ADC多通道)

前言 本篇博客主要学习了解DMA的工作原理和部分寄存器解析&#xff0c;针对ADC多通道来对代码部分&#xff0c;应用部分作详细讲解&#xff0c;掌握代码编程原理。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本次博客开发板使用的是正点原子精英版&am…

已发表的论文职称查重率高【详细说明】

大家好&#xff0c;今天来聊聊已发表的论文职称查重率高&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 已发表的论文职称查重率高 背景介绍 在学术界&#xff0c;论文的原创性和重复率是评价一篇论文质…

【安卓】安卓xTS之Media模块 学习笔记(3) VTS测试

1. 背景 接下来进行正式的VTS测试。本章节还是以Media模块相关进行介绍。 VTS主要测的是内核和HAL层&#xff0c;media的hal层是以openMax&#xff08;即将废弃&#xff0c;今日2023.12&#xff09; 和 Codec2 (后续主流) 接口为主。 这里我们只看Codec2的要求&#xff0c;CDD…

《师兄啊师兄》第二季来了!它凭什么成为修仙流里第一档?

沉寂大半年&#xff0c;修仙喜剧动画《师兄啊师兄》第二季终于“千呼万唤始出来”&#xff0c;即将在12月14日上线。作为优酷动漫本年度的当家之作&#xff0c;这部可谓是热度口碑双丰收&#xff0c;截至第一季收官&#xff0c;相关话题在短视频平台的累计播放量更是高达43亿&a…

字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strcat的模拟实现 &#x1f680;前言 …

OpenCV基础篇

OpenCV基础篇 一、图像、视频读取二、cv::Mat()数据类型三、绘图功能四、鼠标响应事件五、图像像素读写六、图像像素运算七、颜色空间转换八、图像几何变换九、图像滤波十、图像二值化十一、图像梯度十二、Canny边缘检测十三、图像形态学十四、图像直方图十五、霍夫变换十六、分…

jsp使用 分页专用工具

分页器&#xff0c;根据过来的参数计算当着页应当从哪一条记录开始显示&#xff0c;并且显示到哪。 PageUtils [pageSize5, currIndex1, totalCount166, totalPage34, startPosition0] PageUtils [pageSize5, currIndex5, totalCount166, totalPage34, startPosition20] PageUt…

MongoDB的删除文档、查询文档语句

本文主要介绍MongoDB的删除文档、查询文档命令语句。 目录 MongoDB删除文档MongoDB查询文档 MongoDB删除文档 MongoDB是一种基于文档的NoSQL数据库&#xff0c;它使用BSON格式存储文档。删除文档是MongoDB数据库中的常见操作之一。 下面是MongoDB删除文档的详细介绍和示例&am…