算法训练(leetcode)第十六天 | 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

刷题记录

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

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

leetcode题目地址

如果是一颗普通树,则使用暴力求解法:遍历树并保存树种每个节点的值,排序后找差值最小的元素。

本题给的是一颗二叉搜索树(BST),所以其中序遍历就是一个单调递增(不减)序列,而差值最小的两个节点一定是中序遍历中相邻的两个元素。因此,使用中序遍历找相邻两元素之间的最小差值。

本题的思路与98. 验证二叉搜索树的思路很像。

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

递归

// c++
/*** 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:void Order(TreeNode* root, int& min_diff, TreeNode* &pre){if(!root) return;Order(root->left, min_diff, pre);if(pre && root->val - pre->val < min_diff) {min_diff = root->val - pre->val;}pre = root;Order(root->right, min_diff, pre);}int getMinimumDifference(TreeNode* root) {int result = INT_MAX;TreeNode* pre = nullptr;Order(root, result, pre);return result;}
};

非递归

// c++
/*** 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:int getMinimumDifference(TreeNode* root) {stack<TreeNode*> st;int min_diff = INT_MAX;TreeNode* pre = nullptr;while(root || !st.empty()){if(root){st.push(root);root = root->left;}else{root = st.top();st.pop();if(pre && root->val - pre->val < min_diff) min_diff = root->val - pre->val;pre = root;root = root->right;}}return min_diff;}
};

501. 二叉搜索树中的众数

leetcode题目地址

和上题一样,二叉搜索树,中序遍历是单调不减序列,众数在中序遍历中连续出现次数最多的元素,因此使用中序遍历记录元素出现次数,将出现最多元素放入列表。题目提示众数不止一个,所以需要考虑如何使用一次遍历找出所有众数。

假设当前记录的众数出现的次数为maxcnt,在中序遍历时记录每个元素的出现次数,当有元素出现次数与maxcnt相等时,将当前元素放入结果列表;当有元素出现次数大于maxcnt时,清空结果列表并放入当前元素,maxcnt修改为当前元素出现次数。

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

// c++
/*** 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:vector<int> findMode(TreeNode* root) {vector<int> result;int cnt=0, maxcnt=0;stack<TreeNode*> st;int min_diff = INT_MAX;TreeNode* pre = nullptr;while(root || !st.empty()){if(root){st.push(root);root = root->left;}else{root = st.top();st.pop();if(pre && root->val == pre->val ) cnt++;else if(!pre){cnt++;pre = root;}else{cnt=1;pre = root;}if(cnt == maxcnt) result.emplace_back(root->val);else if(cnt>maxcnt) {// 清空结果列表result.clear();result.emplace_back(root->val);maxcnt = cnt;}root = root->right;}}return result;}
};

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

leetcode题目地址

本题需要再找到目标节点后回溯,后序遍历符合回溯要求。

  • 当找到目标节点时返回目标节点
  • 分别递归查看左右子树并记录返回值,分别为lt和rt
  • 若左右子树返回值均不为空,则说明当前节点就是最近的公共祖先
  • 若左右子树返回值有一个为空,则说明两个节点是在同一颗子树中找到的(说明其是目标节点的公共祖先,但不是最近的),则返回不为空的子树的返回值。

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

// c++
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(!root) return nullptr;if(root == p || root == q) return root;TreeNode* lt = lowestCommonAncestor(root->left, p, q);TreeNode* rt = lowestCommonAncestor(root->right, p, q);if(lt && rt) return root;if(lt) return lt;if(rt) return rt;// 叶结点return nullptr;}
};

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

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

相关文章

【Unity】数据持久化 PlayerPrefs

1、PlayerPrefs是什么 是unity提供的可以用于存储读取玩家数据的公共类 2、存储相关 2.1 PlayerPrefs的数据存储类似于键值对存储一个键对应一个值 提供了存储3种数据的方法int float string 键: string类型 值: int float string对应3种API PlayerPrefs.SetInt("myAge…

Web 应用开源项目大全

Web 应用开源项目大全结合巴比达内网穿透实现WEB公开访问。 下面是一个Web应用的开源列表。没什么可说的&#xff0c;太疯狂了。尤其是Web 2.0那一堆。我不知道你怎么想&#xff0c;有些开源项目的源码写得挺不好的&#xff0c;尤其是性能方面。或许你会以为改一改他们就可以成…

java构造方法的重载

在java中&#xff0c;与普通方法一样&#xff0c;构造方法也可以重载&#xff0c;在一个类中可以定义多个构造方法&#xff0c;但是要求每个构造方法的参数类型或参数不同。在创建对象时&#xff0c;可以通过调用不同的构造方法为不同属性赋值。 示例代码如下 class Student5…

全球网络战市场规模未来十年将超过万亿元

报告称&#xff0c;网络战市场涉及组件、最终用户和地区&#xff0c;其中组件分为硬件、软件和服务&#xff0c;最终用户分为政府、企业和私人、航空航天和国防、BFSI&#xff08;银行、金融服务和保险&#xff09;、医疗保健等&#xff0c;地区涉及北美、欧洲、亚太地区和拉美…

python turtle 画帕恰狗

先上个图给大家看看 代码 ##作者V w1933423 import turtle turtle.bgcolor("#ece8dc") turtle.setup(600,900) p turtle.Pen() p.pensize(14) p.speed(5) p.color("black")p.penup() p.goto(-54,-44) p.pendown() p.goto(-37,-39) p.goto(-27,-24) p.go…

Unity如何保存玩家的数据(Unity的二进制序列化)

文章目录 什么是二进制序列化读写文件构造函数 自定义二进制序列化 什么是二进制序列化 Unity中的二进制序列化是一种将游戏对象或数据结构转换为二进制格式的过程&#xff0c;以便于存储或网络传输。这使数据能够以高效的方式保存&#xff0c;同时在需要时可以被正确地恢复&a…

太全了吧?CISP全类别详细介绍,看完不迷惑

今天聊聊CISP&#xff0c;注册信息安全专业人员证。 很多人以为说CISP就是个证书&#xff0c;没这么简单&#xff0c;这里面区别可大了。 CISP根据工作领域和实际岗位需要&#xff0c;分为综合型、攻防领域、IT审计、软件开发、数据治理、电子取证和云安全领域等17项证书。 这么…

C++系统相关操作6 - 获取二进制程序的位数(32位或64位)

1. 关键词2. sysutil.h3. sysutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词&#xff1a; C 程序 32位 64位 跨平台 实现原理&#xff1a; 根据指针地址的位数来判断程序是32位还是64位。 2. sysutil.h #pragma once#include <cstdint> #include &l…

在容器中共享本地文件

在容器中共享本地文件 目录 卷与绑定挂载的对比在主机和容器之间共享文件Docker 访问主机文件的文件权限试一试 运行一个容器使用绑定挂载在 Docker Dashboard 中访问文件停止容器 额外资源下一步 每个容器都有一切需要运行的资源&#xff0c;而不依赖于主机机器上预先安装的…

怎么样才能踏入机器视觉这个行业?

机器视觉从业的定位层次&#xff1a; 00001. 底层算法开发 00002. 应用软件开发 00003. 视觉系统集成 00004. 视觉系统使用刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「机器视觉的资料从专业入门到高级教程」&#xff0c; 00005. 点个关注在评论区回…

[FreeRTOS 功能应用] 信号量 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 信号量 概念 [FreeRTOS 内部实现] 信号量 [FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;信号量实战…

python-pytorc+bert句子分类0.1.000

这里写目录标题 引入包加载预训练模型加载数据文件定义数据实例化数据集使用loader加载数据设定最大句子长度定义加padding的函数定义加collate_fn函数使用DataLoader加载数据 定义模型测试预训练模型输出测试预训练模型输出定义自己的模型 参考 引入包 import torch from tor…

this.$prompt 提示框增加文本域并修改文本域高度

2024.06.24今天我学习了如何对提示框增加文本域的方法&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <script>methods:{reject_event(){this.$prompt(驳回内容, 提示, {confirmButtonText: 确定,cancelButtonText: 取消,inputType: textarea,inputPlaceholder…

计算机网络(数据链路层)

数据链路层概述 数据链路层位于计算机网络的低层&#xff0c;且在物理层之上&#xff0c;数据链路层使用的信道主要有以下两种类型。 &#xff08;1&#xff09;点对点通信。在信道上使用一对一的点对点通信。 &#xff08;2&#xff09;广播信道。这种信道使用一对多的广播通…

【linux】详解——库

目录 概述 库 库函数 静态库 动态库 制作动静态库 使用动静态库 如何让系统默认找到第三方库 lib和lib64的区别 /和/usr/和/usr/local下lib和lib64的区别 环境变量 配置相关文件 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 简介&#xff1a;C站最萌博主 相关…

DDK电通拧紧MFC-S060控制器过流维修

一、DDK伺服拧紧轴控制器过流故障的成因 1. 电源电压过低&#xff1a;当电源电压过低时&#xff0c;控制器可能会出现过流现象。 2. 负载过大&#xff1a;当负载过大时&#xff0c;DDK电通拧紧机控制器MFC-S060的电流也会随之增大&#xff0c;可能导致过流故障。 3. 控制器内部…

自动调整QTableView列宽以适应窗口大小

问题描述 十年前&#xff0c;有人提出了一个问题&#xff1a;当我使用自定义模型来展示 QTableView&#xff0c;并固定了三列时&#xff0c;初始窗口显示正常&#xff0c;但当我调整窗口大小时&#xff0c;QTableView 会随之调整大小&#xff0c;而列宽却保持不变。我想让列宽…

远程连接mysql数据库的详细配置

1. 确认 MySQL 服务器配置 首先&#xff0c;确认 MySQL 服务器的配置允许远程连接。您需要编辑 MySQL 的配置文件&#xff0c;并确保以下设置正确&#xff1a; bind-address&#xff1a;这个参数控制 MySQL 监听的 IP 地址。如果要允许任何 IP 地址连接&#xff0c;请将其设置…

手写 Promise 的实现

手写 Promise 的实现 从实现原理的角度分析 Promise 是什么 从语法上说&#xff0c;Promise 是一个对象&#xff0c;从它可以获取异步操作的消息。ES6 原生提供了Promise对象。 Promise内部有三种状态&#xff1a;pending&#xff08;进行中&#xff09;、fulfilled&#xf…

开箱即用:一个易用的开源表单工具!【送源码】

随着互联网的普及&#xff0c;表单应用场景越来越广泛&#xff0c;从网站注册、调查问卷到考试测评&#xff0c;无处不在。传统的表单制作方式需要一定的代码基础&#xff0c;对于不懂编程的小伙伴来说&#xff0c;无疑是一道门槛。 今天&#xff0c;给大家分享一款开源的表单…