【LeetCode】day18:530 - 二叉搜索树的最小绝对差, 501 - 二叉搜索树中的众数, 236 - 二叉树的最近公共祖先

LeetCode 代码随想录跟练 Day18

  • 530.二叉搜索树的最小绝对差
  • 501.二叉搜索树中的众数
  • 236.二叉树的最近公共祖先

530.二叉搜索树的最小绝对差

题目描述:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。

由于是二叉搜索树,中序遍历展开后的序列为升序。根据这一特性进行遍历,比较当前节点值和按中序遍历顺序上一节点值的差并记录最小,在遍历结束后即可获得结果。代码如下:

class Solution {
private:TreeNode* _pre = nullptr;int _min = INT_MAX;void traverse(TreeNode* root) {if (root == nullptr) return;traverse(root->left);if (_pre != nullptr) {_min = min(_min, root->val - _pre->val);}_pre = root;traverse(root->right);}public:int getMinimumDifference(TreeNode* root) {traverse(root);return _min;}
};

501.二叉搜索树中的众数

题目描述:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树

和上题思路类似,通过中序遍历生成的序列是一个非递减序列,在遍历过程中定义curCount和maxCount分别记录当前数字的出现频率和已有最高的出现频率。
首先处理当前节点计数,若当前节点和上一个节点值相同,则curCount加一否则置为1。接着处理当前计数和最大计数的比较,若相等则表示重复频率即目前为止的频率最高,加入结果中;若当前计数大于最大计数,则表示当前元素出现频率为最高,清空原先的结果vector后加入当前节点值,并更新最大计数。代码如下:

class Solution {
private:TreeNode* _pre = nullptr;int _curCount = 0;int _maxCount = 0;vector<int> _res;void traverse(TreeNode* root) {if (root == nullptr) return;traverse(root->left);if (_pre != nullptr) {if (root->val == _pre->val) {++_curCount;} else {_curCount = 1;}if (_curCount == _maxCount) {_res.push_back(root->val);} else if (_curCount > _maxCount) {_res.clear();_maxCount = _curCount;_res.push_back(root->val);}} else {_maxCount = ++_curCount;_res.push_back(root->val);}_pre = root;traverse(root->right);}public:vector<int> findMode(TreeNode* root) {traverse(root);return _res;}
};

注意到当前写法中的pre节点仅用作判断是否为第一个节点这一情况,可使用值记录进行代替。而这个值的初值无所谓取值因为当前计数和最大计数的初值都为0,无论如何都会进行更新。对此可以优化使逻辑更统一:

class Solution {
private:int _curVal = 0;int _curCount = 0;int _maxCount = 0;vector<int> _res;void traverse(TreeNode* root) {if (root == nullptr) return;traverse(root->left);if (root->val == _curVal) {++_curCount;} else {_curCount = 1;_curVal = root->val;}if (_curCount == _maxCount) {_res.push_back(_curVal);} else if (_curCount > _maxCount) {_res.clear();_maxCount = _curCount;_res.push_back(_curVal);}traverse(root->right);}public:vector<int> findMode(TreeNode* root) {traverse(root);return _res;}
};

236.二叉树的最近公共祖先

题目描述:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
在这里插入图片描述
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
示例 2:
在这里插入图片描述
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
示例 3:
输入:root = [1,2], p = 1, q = 2
输出:1

题中有前提是p和q在树中存在,在这一前提下的思路:对于遍历到的节点,在左右子树下分别寻找p和q的公共节点,若找到公共节点或是p和q其中之一则将其返回。若当前节点对左右子树寻找公共节点均有返回,则表示左右分别找到了p和q,当前节点为公共节点,作为结果返回;若左右子树寻找公共节点仅有一个nullptr,则返回另一个,作为已找到的公共节点或两节点之一的回溯;若均为nullptr,则表示当前节点寻找无结果,返回nullptr。代码如下:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == nullptr || root == p || root == q) {return root;}TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);if (left && right) {return root;}if (left) return left;if (right) return right;return nullptr;}
};

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

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

相关文章

基于组态王和S7-200实现传感器连接的简单人机界面

在当今社会&#xff0c;工业自动化正以前所未有的速度发展&#xff0c;成为推动经济增长和提升生产效率的关键因素之一。随着科技的不断进步&#xff0c;自动化不仅仅是制造业的专利&#xff0c;也逐渐渗透到农业、交通、建筑等各个领域&#xff0c;为人们的生活带来了诸多变革…

星际漫游闪耀LEC授权展,COSMOSPANDA星际熊猫与BUNBUNX包小冥共绘国潮新篇章

上海&#xff0c;2024年7月17日 —— 在全球瞩目的2024年LEC全球授权展上海站盛大开幕之际&#xff0c;星际漫游携其两大国潮明星IP——COSMOSPANDA星际熊猫与bunbunx包小冥精彩亮相&#xff0c;为现场观众带来了一场融合视觉与文化的国潮盛宴。 展位盛况空前&#xff0c;国潮…

uniapp封装请求拦截器,封装请求拦截和响应拦截的方法

首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api 1 2 3 4 5 6 7 8 9 uni.request({ url: , method: GET, data: {}, header: {}, success: res > {}, fail: () > {}, complete: () > {} }); 可以看到我们每次请求数据的时候都需…

pytest-fixture

资料来源&#xff1a;虫师2020的个人空间-虫师2020个人主页-哔哩哔哩视频 支持类似unittest风格的fixture&#xff0c;即setup和teardown class类中的方法分类 类方法可以直接调用&#xff0c;需要添加装饰器&#xff0c;修改类中的变量 实例方法&#xff0c;需要先实例化&…

【移动应用开发】创建Hello World应用

目录 一、安装Android Studio &#xff08;2023.1.28&#xff09; 二、创建HelloWorld的项目 1. 新建一个项目&#xff0c;选择Empty Views Activity 2. 点击next之后&#xff0c;为项目命名为HelloWorld 3. 点击Finish之后等待项目创建 三、观察项目结构 1. 选择以Proj…

预测性营销与开源AI智能名片商城系统的融合创新:探索数据驱动的营销新纪元

摘要&#xff1a;在当今这个数据驱动的时代&#xff0c;企业面临着前所未有的市场复杂性和消费者行为的快速变化。为了在这样的环境中保持竞争力并实现持续增长&#xff0c;预测性营销已成为企业不可或缺的战略工具。本文深入探讨了预测性营销的基本原理、技术架构及其在市场营…

常用注意力机制 SENet CBAM ECA

在处理脑电信号时通常会用到一些注意力机制,来给不同的脑电通道不同的权重,进而体现出不同脑电通道在分类中的重要性。下面整理几种常见的通道注意力机制,方便以后查阅。 常用注意力机制 SENet CBAM ECA 注意力机制SENet(Squeeze-and-Excitation Network)SENet原理SENet P…

MySQL相关知识

一、什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xff09;概念&#xff1a; 长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个 数据“仓库”。 二、数据库的特点&#xff1a; 1.结构化&#xff1a;数据在数…

【leetcode】二分查找本质

标题&#xff1a;【leetcode】二分查找本质 水墨不写bug 正文开始&#xff1a;&#xff08;点击题目标题转跳到OJ&#xff09; 目录 &#xff08;O&#xff09;前言* &#xff08;一&#xff09; 在排序数组中查找元素的第一个和最后一个位置 思路详解&#xff1a; 参考代…

Python 爬虫 获取Instagram用户数据信息 Instagram API接口

爬取instagram用户主页数据信息 详细采集页面如下 https://www.instagram.com/abdallhdev/?hlen 请求API http://api.xxxx.com/ins/profile/username?usernameabdallhdev&tokentest 请求参数 返回示例 联系我们&#xff08;更多接口详见主页专栏&#xff09; 更多精彩…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…

VScode通过Graphviz插件和dot文件绘制层次图,导出svg

1、安装插件 在VScode中安装Graphviz Interactive Preview插件&#xff0c;参考。 2、创建dot文件 在本地创建一个后缀为dot的文件&#xff0c;如test.dot&#xff0c;并写入以下内容&#xff1a; digraph testGraph {label "层次图";node [shape square; widt…

一文读懂英伟达A800的性能及应用场景

随着人工智能&#xff08;AI&#xff09;和高性能计算&#xff08;HPC&#xff09;领域的快速发展&#xff0c;对处理器的性能要求日益提高。英伟达&#xff08;NVIDIA&#xff09;作为全球领先的图形处理器&#xff08;GPU&#xff09;和人工智能技术公司&#xff0c;不断推出…

全国区块链职业技能大赛国赛考题区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 本任务需要依据项目背景完成需求分析与方案设计,具体要求如下: 依据给定区块链食品溯源系统的业务架构图,对考题进行业务分析,尽可能多的去考虑一个业务系统所需要的模块,使用Visio或思维导图工具展现本系统的基本设计概念和处理流…

python基础语法 007 文件操作-2文件支持模式文件的内置函数

1.3 文件支持的模式 模式含义ropen a file for reading(default)wopen a file for writing,creates a new file if it does not exist or truncates the file if it exists x open a file foe exclusive creation. if the file already exists, the operation fails.独创模式&…

约束

概述 概念 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的 保证数据库中数据的正确、有效性和完整性。 分类 【注意】约束是作用于表中字段上的&#xff0c;可以在创建表/修改表的时候添加约束。 约束演示 根据需求&#xff0c;完成表结构的…

Docker核心技术:应用架构演进

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;应用架构演进&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进&#xff08;本文&#xff09;容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 1.1.架…

blender使用(三)常用建模操作及修改器

1&#xff0c;挤出图形 tab编辑模式&#xff0c;选中一个点/线/面&#xff0c;按键E&#xff0c;可以挤出对应的图形。选中点会挤出一条线&#xff0c;线会挤出一个面&#xff0c;面挤出体 2&#xff0c;倒角 选中一个边后&#xff0c;ctrlB &#xff0c;拖动鼠标是倒角范围&am…

数据结构 day3

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 顺序表 1.1 概念 1.2 有关顺序表的操作 1.2.1 创建顺序表 1.2.2 顺序表判空和判断满 1.2.3 向顺序表中添加元素 1.2.4 遍历顺序表 1.2.5 顺序表按位置进行插入元素 1.2.6 顺序表任意位置删除元素 1.2.7 按值进…

智能取纸机,帮助移动公厕,无人值守降低运营成本

在快节奏的城市生活中&#xff0c;移动公厕作为临时性或应急性的公共卫生设施&#xff0c;扮演着不可或缺的角色。然而&#xff0c;传统移动公厕的管理面临着诸多挑战&#xff0c;尤其是纸巾供应与使用效率问题。近年来&#xff0c;智能取纸机的出现&#xff0c;为移动公厕的管…