当前位置: 首页 > news >正文

183.二叉树:二叉搜索树中的众数(力扣)

代码解决

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* pre = nullptr; // 用于记录前一个节点int count = 0, maxCount = 0; // 当前节点值的计数和最大计数vector<int> result; // 记录出现次数最多的值// 中序遍历函数void traversal(TreeNode* node){if(node == nullptr) return; // 如果当前节点为空,则返回traversal(node->left); // 递归遍历左子树// 处理当前节点if(pre == nullptr) {count = 1; // 如果前一个节点为空,说明是第一个节点,计数设为1}else if(pre->val == node->val){count++; // 如果当前节点值与前一个节点值相等,计数加1}else{count = 1; // 如果当前节点值与前一个节点值不等,重新计数}pre = node; // 更新前一个节点为当前节点if(count == maxCount){result.push_back(node->val); // 如果当前计数等于最大计数,加入结果}if(count > maxCount){maxCount = count; // 如果当前计数大于最大计数,更新最大计数并清空结果重新加入result.clear();result.push_back(node->val);}traversal(node->right); // 递归遍历右子树}// 找到二叉搜索树中出现次数最多的值vector<int> findMode(TreeNode* root) {count = 0;maxCount = 0;pre = nullptr; // 重置前一个节点result.clear();traversal(root); // 开始中序遍历return result;}
};
  1. 定义三个全局变量 precount 和 maxCount,分别用于记录前一个节点、当前节点值的计数和最大计数。
  2. 定义一个全局变量 result 用于记录出现次数最多的值。
  3. 定义一个辅助函数 traversal,它接受当前节点作为参数。
  4. 如果当前节点为空,则返回。
  5. 递归地遍历左子树。
  6. 处理当前节点:
    • 如果 pre 为空,说明是第一个节点,计数设为1。
    • 如果当前节点值与 pre 节点值相等,计数加1。
    • 如果当前节点值与 pre 节点值不等,重新计数。
    • 更新 pre 为当前节点。
    • 如果当前计数等于最大计数,加入结果向量。
    • 如果当前计数大于最大计数,更新最大计数并清空结果向量,然后加入当前节点的值。
  7. 递归地遍历右子树。
  8. 在 findMode 函数中,重置计数和最大计数,清空结果向量,开始中序遍历,并返回结果向量。

这个算法的时间复杂度是 O(n),因为每个节点都会被访问一次,其中 n 是树中节点的数量。空间复杂度也是 O(n),因为需要存储递归调用的栈。

相关文章:

  • 【玄机-应急平台】第六章 流量特征分析-常见攻击事件 tomcat
  • 获取域名证书过期时间脚本——筑梦之路
  • PHP短链接短网址生成源码
  • Apache配置与应用
  • 10.GLM
  • SpringMVC-基础架构
  • 基于软件在环的飞控机建模仿真
  • 国外有哪些知名的CG网站?CG平台及云渲染平台
  • Kettle根据分类实现Excel文件拆分——kettle开发31
  • 视频格式转换avi格式怎么弄?分享视频转换方法
  • sqlcoder:7b sqlcoder:15b sqlcoder:70b 有什么区别呢?
  • 直接使用Three.js的 Shape和ExtrudeGeometry创建带孔几何体实现挖孔效果
  • Go模板页面浏览器显示HTML源码问题
  • 百度OCR初探-python
  • 怎么提升机器人外呼的转化效率
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Docker容器管理
  • HTTP那些事
  • js中的正则表达式入门
  • Lucene解析 - 基本概念
  • php ci框架整合银盛支付
  • 从输入URL到页面加载发生了什么
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Android乐音识别(2)
  • 数组大概知多少
  • 网络应用优化——时延与带宽
  • 我感觉这是史上最牛的防sql注入方法类
  • 怎么把视频里的音乐提取出来
  • zabbix3.2监控linux磁盘IO
  • 如何在招聘中考核.NET架构师
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #ifdef 的技巧用法
  • (1)虚拟机的安装与使用,linux系统安装
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (solr系列:一)使用tomcat部署solr服务
  • (二)c52学习之旅-简单了解单片机
  • (翻译)terry crowley: 写给程序员
  • (分类)KNN算法- 参数调优
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译) 函数式 JS #1:简介
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .DFS.
  • .NET CORE Aws S3 使用
  • .net 托管代码与非托管代码
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .pop ----remove 删除
  • @我的前任是个极品 微博分析