每日一练:LeeCode-501、二叉搜索树中的众数【二叉搜索树+pre辅助节点+DFS】

news2024/11/28 4:36:01

本文是力扣LeeCode-LeeCode-501、二叉搜索树中的众数【二叉搜索树+pre辅助节点+DFS】 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。

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

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

假定 BST 满足如下定义:

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

示例 1:
在这里插入图片描述

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

示例 2:

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

提示:

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

思路

思路一(普通二叉树)

首先这道题要求的是二叉搜索树,如果为我们直接把它当成一颗普通⼆叉树,也是可以直接解决的遍历存数组+使用map统计频率+最后取高频的一个或者多个数

思路二(二叉搜索树)

  • 既然是搜索树,它中序遍历就是有序的
  • 遍历有序数组的元素出现频率从头遍历,那么⼀定是相邻两个元素作⽐较,然后就把出现频率最⾼的元素输出即可
  • 出现相邻两个元素的情况,可以使⽤pre指针和cur指针的技巧了
  • 需要注意初始化的时候pre = NULL,实际上比较的是第⼀个元素

统计众数出现次数的代码:

        if (pre==null){	// 第⼀个节点
            count=1;	// 频率为1
        } else if (pre.val==cur.val) {	// 与前⼀个节点数值相同
            count++;
        } else{			// 与前⼀个节点数值不同,则复原
            count=1;
        }

        pre = cur;		// 更新上⼀个节点

本题要求的是:返回众数集合/数组
1、正常逻辑第一遍先找出最⼤频率maxCount,然后重新遍历⼀遍数组把出现频率为maxCount的元素放进众数集合里,最终需要两遍

2、遍历一次数组(只需要遍历⼀遍⼆叉搜索树,就求出了众数的集合)

  • maxCount需要最⼤频率的时候保存
  • 频率count ⼤于 maxCount的时候,不仅要更新maxCount,⽽且要清空结果集,留着之前的结果集不对

实现代码

class Solution {
    TreeNode pre = null;
    int count = 0;		 // 统计频率
    int maxCount = 0;	 // 最⼤频率
    List<Integer> resList = new ArrayList<>();
    public int[] findMode(TreeNode root) {
        searchBST(root);	
        int[] result = new int[resList.size()];
        for (int i=0;i<resList.size();i++){
            result[i] = resList.get(i);
        }
        return result;
    }

    void searchBST(TreeNode cur){
        if (cur==null)return;
        searchBST(cur.left);	// 左
		// 中
        if (pre==null){		// 第⼀个节点
            count=1;
        } else if (pre.val==cur.val) {	// 与前⼀个节点数值相同
            count++;
        } else{		// 与前⼀个节点数值不同
            count=1;
        }

        pre = cur;		// 更新上⼀个节点

        if (maxCount==count)resList.add(cur.val);	// 如果和最⼤值相同,放进resList中
        if (count>maxCount){	// 计数⼤于最⼤值频率
            maxCount = count;	// 更新最⼤频率
            resList.clear();	// 很关键的⼀步,不要忘记清空resList,之前resList⾥的元素都失效了
            resList.add(cur.val);
        }
        searchBST(cur.right);	// 右
        return;
    }
}

最重要的一句话:做二叉树的题目,首先需要确认的是遍历顺序
大佬们有更好的方法,请不吝赐教,谢谢

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

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

相关文章

【大模型 向量库】从向量搜索到向量数据库

大模型向量库 向量&#xff1a;AI核心向量库&#xff1a;语义近似搜索大模型 向量库YOLO 向量数据库嵌入&#xff08;Embedding&#xff09;设计最近邻搜索近似近邻搜索 向量&#xff1a;AI核心 向量伴随着 AI 模型的发展而发展。 向量&#xff1a;AI 理解世界的通用数据形…

C 语言 devc++ 使用 winsock 实现 windows UDP 利用 IP 进行局域网发送消息

UDP 通信流程_udp通信过程-CSDN博客参考来源 UDP 通信流程_udp通信过程-CSDN博客 这里移植到windows 上 &#xff0c;使用 devc 开发。 服务端代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <…

【Vitis】Vitis性能优化的开源库

Vitis HLS简介 Vitis™HLS是一种高层次综合工具&#xff0c;支持将C、C和OpenCL™函数硬连线到器件逻辑互连结构和RAM/DSP块上。 Vitis HLS可在Vitis应用加速开发流程中实现硬件内核&#xff0c;并使用C/C语言代码在VivadoDesign Suite中为赛灵思器件设计开发RTL IP。 【Vitis…

springboot单体项目快速生成代码

生成的是这些代码&#xff1a;controller,entity,mapper,service,service里面的impl,还有xml import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolk…

SQL笔记-多表查询(合并记录新增字段)

比如要统计2张表的所有数据,这两张表无关联关系,统计的数据需要在同一行: SELECT (SELECT COUNT(*) FROM reptile_csdn_article) AS table1_count, (SELECT COUNT(*) FROM reptile_tag_type) AS table2_count 运行截图如下: 大于2张表按上面的格式进行修改即可。 下面也是…

满效--深圳亚太口腔医学高新技术博览

哈尔滨市夔沣生物科技有限公司丨SDHE 2023深圳亚太口腔医学高新技术博览会感恩有您&#xff01; 2024再相聚 深圳亚太口腔展 2023年12月6-8日&#xff0c;为期三天的“深圳亚太口腔医学高新技术博览会”在中国深圳&#xff0c;圆满落下帷幕。 哈尔滨市夔沣生物科技有限公司出品…

高效的FTP替代产品,如何解决FTP文件传输存在的弊端?

FTP最初并不是为IP网络设计的&#xff0c;而是在ARPANET&#xff08;Advanced Research Projects Agency Network&#xff0c;美国国防部高级研究计划署网络&#xff09;中作为计算机间文件传输的协议。1971年&#xff0c;Abhay Bhushan提出了FTP的第一个RFC&#xff08;Reques…

【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 111 二叉树的最小深度 Leetcode 110 平衡二叉树

【深度优先】【广度优先】Leetcode 104 二叉树的最大深度 Leetcode 111 二叉树的最小深度 Leetcode 110 平衡二叉树 Leetcode 104 二叉树的最大深度解法1 深度优先 递归法 后序&#xff1a;左右中解法2 广度优先&#xff1a;层序遍历 Leetcode 111 二叉树的最小深度解法1 深度…

Codeforces Round 924 (Div. 2)题解(A-D)

A - Rectangle Cutting 链接&#xff1a;A - Rectangle Cutting 思路 考虑横边和纵边&#xff0c;若为偶数&#xff0c;则从中间分开&#xff0c;重新组合为一个长方形&#xff0c;检测是否与原来的长方形一致。 代码 #include <bits/stdc.h> using namespace std;i…

湖南建研工程质量检测系统/Scripts/admintool文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

2.C语言——输入输出

1.字符输入输出函数 1.输入:getchar() 字面意思&#xff0c;接收单个字符&#xff0c;使用方法 char a; a getchar();实际上效果等同于char a; scanf("%c",&a);2.输出:putchar() 2.格式化输入输出函数 1.输入:scanf() 格式&#xff1a; scanf(“格式控制…

lvs DR模式+基于五台服务器部署keepalived + lvs DR模式架构(前端带路由)负载均衡的高可用集群

lvs DR模式基于五台服务器部署keepalived lvs DR模式架构(前端带路由)负载均衡的高可用集群 DR模式一&#xff1a; 客户端&#xff1a;172.20.26.167 LVS服务器&#xff1a;172.20.26.198 后端服务器&#xff1a;172.20.26.218 后端服务器&#xff1a;172.20.26.210 两台…

day05-股票数据采集功能

股票数据采集 今日目标 1.掌握RestTemplate基本使用; 2.阅读并理解第三方股票接口API; 3.基于RestTemplate实现国内大盘数据采集功能; 3.1 项目集成RestTemplate; 3.2 理解基于正则解析响应数据原理; 3.3 掌握常用lambda stream流操作; 4.基于RestTemplate实现国内板块和股票…

浅析SPDK技术:vhost

文章目录 SPDK vhost工作机制SPDK vhost实现SPDK vhost设备管理结构vhost_dev_register&#xff1a;注册vhost设备new_connection&#xff1a;新建连接会话start_device&#xff1a;启动设备会话 SPDK vhost-blk实现rpc_vhost_create_blk_controller&#xff1a;创建vhost-blk设…

Feign 第一次调用为什么会很慢?

前言 首先要了解 Feign 是如何进行远程调用的&#xff0c;这里面包括&#xff0c;注册中心、负载均衡、FeignClient 之间的关系&#xff0c;微服务通过不论是 eureka、nacos 也好注册到服务端&#xff0c;Feign 是靠 Ribbon 做负载的&#xff0c;而 Ribbon 需要拿到注册中心的…

融智学应用场景实训实操文化基因系统工程实践指南讲座音频

俗话说&#xff0c;听君一席话胜读十年书。戴上耳机闭目倾听&#xff08;语言哲学和语言科学基础之上的融智学&#xff09;&#xff1a; “融智学应用场景实训实操文化基因系统工程实践指南讲座音频”&#xff08;一共七章&#xff09;随之便会发现&#xff0c;原来汉字汉语暨…

卫星热平衡试验与太阳光模拟器

卫星热模型是一种用于研究卫星的热特性的模型。卫星在太空中接收到的太阳辐射会导致其表面温度的变化&#xff0c;而表面温度的变化会影响卫星的热传导和热辐射&#xff0c;进而影响其冷却和热平衡。 卫星热模型一般涉及以下几个方面的内容&#xff1a; 1. 热辐射模型&#xf…

Midjourney风格一致功能解读及使用方法

Midjourneys再次迎来更新&#xff0c;本次新增“风格一致”功能&#xff01;用户期待已久的风格模仿功能终于实现了&#xff01; --sref 虽然目前只是测试功能&#xff0c;但已经相当强大了&#xff0c;这篇文章我将带大家先睹为快&#xff01; 别忘了&#xff0c;这个功能目前…

C语言第二十七弹---内存函数

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 内存函数 1、memcpy 使用和模拟实现 2、memmove 使用和模拟实现 3、memset 函数的使用 4、memcmp 函数的使用 总结 前面两弹讲解了字符函数和字符串函数&…

【千帆平台】使用千帆大模型平台创建自定义模型调用API,贺岁灵感模型,文本对话

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和…