代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

SAP系统中PP模块全配置文档 配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。 阅读详情

二叉搜索树的最小绝对值差

递归法        

        首先需考虑这是一个二叉搜索树,在中序遍历后的结果为从小到大的一个序列,寻找二叉搜索树的最小绝对值差,只需比较一个节点与之后的差值即可。在遍历的过程中,我们需要一个节点保存前节点,之后计算前节点和当前节点的差值,将所有节点都遍历一遍后即可得到二叉搜索树的最小绝对值差。

class Solution {
public:
    // 用于存储最小差值的变量,初始值设为最大整数,以便后续比较
    int minDiff = INT_MAX;
    // 用于记录前一个节点的指针,初始值为nullptr
    TreeNode *pre = nullptr;

    // 中序遍历二叉树的递归函数
    void inorder_traversal(TreeNode* root, TreeNode*& pre, int& minDiff) {
        // 如果当前节点为空,则返回
        if(root == nullptr){
            return;
        }
        // 首先递归遍历左子树
        inorder_traversal(root->left, pre, minDiff);
        // 如果前一个节点不为空,则计算当前节点和前一个节点的差值,并更新最小差值
        if(pre != nullptr){
            minDiff = std::min(minDiff, root->val - pre->val);
        }
        // 将当前节点设置为前一个节点,以便下一次比较
        pre = root;
        // 最后递归遍历右子树
        inorder_traversal(root->right, pre, minDiff);
    }

    // 主函数,调用中序遍历函数并返回最小差值
    int getMinimumDifference(TreeNode* root) {
        TreeNode* pre = nullptr; // 前一个节点的指针
        int minDiff = INT_MAX;  // 最小差值
        // 调用中序遍历函数
        inorder_traversal(root, pre, minDiff);
        // 返回最小差值
        return minDiff;
    }
};

算法的时间复杂度和空间复杂度为O(n)。

二叉搜索树中的众数

递归+哈希表

        由于要遍历所有的节点,最简单的方法,创建一个哈希表,将所有的节点出现次数加入哈希表,最后将哈希表中出现次数最多的数全部返回。

class Solution {
public:
    //前序遍历
    void preorder_traversal(TreeNode* root, unordered_map<int, int>& umap) {
        if (root == nullptr) {
            return;
        }
        umap[root->val] += 1; // 统计当前节点值的出现次数
        preorder_traversal(root->left, umap); 
        preorder_traversal(root->right, umap);
    }

    vector<int> findMode(TreeNode* root) {
        int max_value = 0; // 用于存储最大出现次数
        vector<int> ans; // 用于存储众数
        unordered_map<int, int> umap; // 用于存储每个值及其出现次数
        preorder_traversal(root, umap); // 调用前序遍历函数

        // 遍历哈希表,找到出现次数最多的值
        for (const auto& pair : umap) {
            if (pair.second > max_value) {
                max_value = pair.second; // 更新最大出现次数
                ans.clear(); // 清空之前的众数
                ans.push_back(pair.first); // 添加新的众数
            } else if (pair.second == max_value) {
                ans.push_back(pair.first); // 如果有多个出现次数相同的值,都添加到众数列表中
            }
        }
        return ans; // 返回众数列表
    }
};

分析代码的时间复杂度和空间复杂度。

在时间复杂度上,遍历树的每一节点,时间复杂度为O(n),此外,在寻找众数时,需要遍历哈希表,同样需要O(n),综上,时间复杂度为O(n)。

空间复杂度,哈希表存储了树中所有不同值的出现次数,最差情况为O(n),此外,递归调用栈的空间复杂度为O(H),H为树的高度,最差情况下为O(n)。因此最终时间复杂度和空间复杂度均为O(n)。

双指针

二叉搜索树,一定得是中序遍历,中序遍历结果的序列才是有序的。

定义一个全局变量max_count,一个count,在函数体创建一个ans数组,在中序遍历时,参考上题,设定一个pre指针,指向当前的前一个位置,当现在位置的val与pre->val相同时,count++,遍历第一次的count更新max_count,并将值加入ans数组,之后的遍历结果若count大于max_count,则更新max_count,并将ans数组清空,并将val值存入数组,若count等于max_count,则在ans数组中加入val。遍历一次之后即能得到所有众数。

class Solution {
public:
    int max_count = 0;
    int count = 1;
    TreeNode*pre = nullptr;
    void inorder_traversal(TreeNode* root,vector<int>&ans){

        if(root == nullptr){
            return;
        }
        inorder_traversal(root->left,ans);
        if(pre != nullptr){
                if(root->val == pre->val){
                    count++;
                }
                else{
                    count = 1;
            }
        }
        if(count > max_count){
            max_count = count;
            ans.clear();
            ans.push_back(root->val);
        }
        else if(count == max_count){
            ans.push_back(root->val);
        }
        pre = root;
        inorder_traversal(root->right,ans);
    }
    vector<int> findMode(TreeNode* root) {
        vector<int>ans;
        inorder_traversal(root,ans);
        return ans;

    }
};

算法的时间复杂度和空间复杂度均为O(n)。

二叉树的最近公共祖先

递归法

由于是要寻找最近的公共祖先,我们得考虑从叶子节点向上递归,因此考虑后序遍历的方式,左右中,从底部向上找。

具体参考代码随想录讲解视频。

自底向上查找,有点难度! | LeetCode:236. 二叉树的最近公共祖先_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1jd4y1B7E2/?spm_id_from=333.788&vd_source=fc4a6e70e3a87b7ea67c2024e326e7c5

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        // 如果当前节点为空,或者等于p或q,直接返回当前节点
        if (root == nullptr || root == p || root == q) {
            return root;
        }

        // 在左右子树中递归寻找p和q
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        // 如果左右子树的返回值都不为空,说明当前节点就是最近公共祖先
        if (left != nullptr && right != nullptr) {
            return root;
        }

        // 否则,返回非空的子树返回值
        return left != nullptr ? left : right;
    }
};

算法的时间复杂度和空间复杂度均为O(n)

(七)独立按键 阅读详情

相关推荐

构建家庭NAS之三:在TrueNAS SCALE上安装qBittorrent

以qBittorrent为例,说明如何在TrueNAS SCALE上使用docker来安装应用。

luoqingyong的博客 7005

代码随想录算法训练营 day21 || 530.二叉搜索树的最小绝对值之差,501.二叉树中的众数,236.二叉树的最近公共祖先

是因为二叉搜索树,是这个条件赋予了之后,我们仅仅需要定位根节点与左子树最右节点和根节点与右子树最左节点,这两种情况之中一定是最小差值的存在之处,然后对每一个具有子树的节点都这么考虑一遍,可以统计处全局最小差值,而我们还原来看,左子树的最右节点与右子树的最左节点之间在遍历后的结果上就是相邻的(中序遍历的结果),下面给出图示让大家理解。所以除了叶子节点,每一个有子树的节点都是有两个与自己最为相接近的节点,而我们计算节点差的最小值,这表明树上一定不只是存在叶子节点,一定是有根节点或者父节点;

旭 956

稳压电源的隐形战场:动态特性如何影响你的嵌入式系统稳定性

本文深入探讨了稳压电源动态特性对嵌入式系统稳定性的关键影响,分析了HT7533和AMS1117等稳压芯片在输入阶跃响应和负载瞬态响应方面的性能差异。通过实测案例展示了不同场景下的动态特性表现,并提供了针对工业控制、IoT设备和射频系统的选型指南与优化策略,帮助工程师解决电源相关的隐蔽故障。

weixin_29204205的博客 609

代码随想录算法训练营Day16 | Leetcode 530二叉搜索树的最小绝对差、501二叉搜索树中的众数、236二叉树的最近公共祖先

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(的根节点 root ,返回 树中任意两不同节点值之间的最小差值。进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。提示:树中至少有 2 个节点。

叽里呱啦大王的博客 1380

基于C#的软PLC梯形图编辑器开发实战

本文详细介绍了基于C#开发软PLC梯形图编辑器的实战过程。文章从核心数据结构设计入手,阐述了如何利用C#的面向对象特性构建梯形图元素模型,并实现了图形编辑、指令表输入、逻辑连接拓扑重建等关键功能。重点剖析了模拟PLC执行引擎的扫描周期与能流传递算法,让梯形图逻辑在PC上“活”起来。最后探讨了定时器指令实现、性能优化及项目集成等进阶内容,为工业自动化软件集成提供了灵活高效的解决方案。

weixin_28314575的博客 403

Coze HTTP请求节点实战:5分钟搞定天气API对接(含动态参数技巧)

本文通过一个天气预报API对接的实战案例,详细讲解了如何在Coze平台使用HTTP请求节点实现外部数据交互。文章重点演示了动态参数传递、JSON响应解析与错误处理等核心技巧,帮助开发者在5分钟内快速构建稳定可靠的智能体外部服务调用能力。

weixin_29233333的博客 675

代码随想录算法训练营Day18 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

训练营第18天:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

jiabao0520的博客 1196

CoppeliaSim和Python进行无人机联合仿真

CopeeliaSim和Python进行无人机轨迹跟踪联合仿真。首先建立起CoppeliaSim和Python的连接,其次在Python中生成轨迹,CoppeliaSim仿真环境中的无人机进行跟踪,并绘制出轨迹曲线,有每一步详细的教学。

加斯顿工程师的博客 986

代码随想录算法训练营day20||二叉树part07、● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。同时要学会在递归遍历的过程中如何记录前后两个指针,这也是一个小技巧,学会了还是很受用的。后面我将继续介绍一系列利用二叉搜索树特性的题目。本题在递归法中,我给出了如果是普通二叉树,应该怎么求众数。知道了普通二叉树的做法时候,我再进一步给出二叉搜索树又应该怎么求众数,这样鲜明的对比,相信会对二叉树又有更深层次的理解了。

qq_40222433的博客 1089

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

Echo_Wish 240

YOLO11改进策略【独家融合改进】| EfficientViMBlock + LGAG + DySample

通过学习采样来学习上采样DySample。

Limiiiing的博客 362

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

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

m0_65709641的博客 1040

旗鱼优化算法(SFO)详解:从海洋猎手到智能优化

旗鱼优化算法(SFO)是一种新型群体智能优化算法,灵感来源于旗鱼的群体捕食行为。该算法采用双种群机制,模拟旗鱼(精英个体)与沙丁鱼(普通个体)的交互过程,通过交替攻击策略实现探索与开发的平衡。核心机制包括:基于猎物密度的旗鱼位置更新、随迭代衰减的攻击力度控制、以及捕食替换机制。SFO具有参数少、全局搜索能力强等特点,在高维复杂优化问题中表现优异。算法通过模拟自然界中的群体智能行为,为解决工程优化问题提供了新思路。

qq_42212808的博客 163

代码随想录算法训练营Day21|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

本题要求在二叉搜索树上任意两节点的差的绝对值的最小值。与上题验证二叉搜索树题目类似,可以用数组保存二叉树节点数值进行操作的直接法,也可以利用双指针法进行实现。本题假设二叉搜索树有重复出现的节点,要统计该二叉搜索树中的众数(即出现频率最高的节点数值),值得注意的是,频率最高的节点数值不一定只有一个。本题我们不仅对二叉搜索树的众数进行求解,还对普通二叉树众数也进行算法实现。查找二叉树两节点的最近公共祖先,可以利用后序递归的回溯过程,子弟向上查找最近的公共祖先,根据左右子树的返回值,来处理中节点的逻辑。

m0_68682181的博客 1123

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

代码随想录算法训练营day18(python版)|第六章 二叉树part06| 530.二叉搜索树的最小绝对差·501.二叉搜索树中的众数·236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差需要领悟一下二叉树遍历上双指针操作,优先掌握递归思路BST 中序遍历是升序;最小绝对差只会出现在中序相邻节点之间;遍历时维护prev(上一个访问的值)并滚动更新答案。

qq_43752779的博客 705

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

代码随想录算法训练营第day20|530.二叉搜索树的最小绝对差 、 501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。进阶:你可以不使用额外的空间吗?

qq_60513199的博客 749

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

代码随想录算法训练营day18

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:提示:树中至少有 2 个节点。递归那么二叉搜索树采用中序遍历,其实就是一个有序数组。最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。需要领悟一下二叉树遍历上双指针操作,优先掌握递归给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。例如:给定 BST [1,null,2,2],返回[2].

Icewolf273的博客 857

代码训练营 day17|LeetCode 530,LeetCode 501,LeetCode 236

今天主要学习了二叉树的一系列操作,今天公共父节点那题比较难,其他还行。加油,坚持打卡的第17天。

qq_44639909的博客 1164

代码随想录算法训练营day18|二叉树06

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

gyuhyhui的博客 916

代码随想录-算法训练营day21【二叉树07:二叉搜索树的最小绝对差、二叉搜索树中的众数、二叉树的最近公共祖先】

代码随想录-算法训练营day21【二叉树07:二叉搜索树的最小绝对差、二叉搜索树中的众数、二叉树的最近公共祖先】

upward 722

代码随想录算法训练营43期 | Day 18——530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数

中序遍历,得到的一个有序的序列,然后从扫描这个中序遍历序列,然后用一个哈希表来统计每个数字出现的个数,这样就可以找到出现次数最多的数字。给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值。但是,这样一颗二叉搜索树的中序遍历序列是 {−1,0,0,1,2,2}。来维护已经扫描过的数当中出现最多的那个数字的出现次数,用。将二叉搜索树得到有序的数组,在求两个元素的最小绝对差。

当代优秀青年的学习博客 570

代码随想录算法训练营Day 21|LeetCode530 二叉搜索树的最小绝对差、Leetcode501 二叉搜索树中的众数、Leetcode236 二叉树的最近公共祖先

在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。本题仍可使用中序遍历得出一个升序数组求得相邻最小绝对值差,但为了简便起见直接在遍历树时计算出差值,此时只需要一个指向前一个结点的指针pre。求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。后序遍历是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。空间复杂度:O(n)空间复杂度:O(n)

qq_52807368的博客 1128

代码随想录算法训练营day20

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。示例:提示:树中至少有 2 个节点。

xijiancui的博客 1325

代码随想录算法训练营day21| 530二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先

这道题目刷过的同学未必真正了解这里面回溯的过程,以及结果是如何一层一层传上去的。那么我给大家归纳如下三点求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。

xinrenne的博客 184

代码随想录算法训练营Day 18|Python|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先

本题依然使用中序遍历,设定初始count=0,max_count = 0, result = [], pre = None,遍历到中间节点时,检查是否在叶子节点,直接count=1,如果pre=cur,说明有重复节点,count += 1,否则就是新的节点但是不重复,count = 1。递归逻辑:left,right分别递归,便利中间节点时如果左右都有,返回root,只有左边有,返回左边,只有右边有,返回右边。利用pre,cur进行对比,进行中序遍历,形成的遍历数组是递增关系,进行前后对比即可。

qq_60959261的博客 452

代码随想录算法训练营Day19 | 二叉树 530.二叉搜索树的最小绝对差 501.二叉搜索树种的众数 236.二叉树的最近公共祖先

最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。tips:树中至少有2个节点。二叉搜索树是有序的。236. 二叉树的最近公共祖先。

weixin_65053787的博客 623
上一篇: 代码随想录算法训练营day20|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
下一篇: 代码随想录算法训练营Day22|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
viaNoir
博客等级 码龄10年 535粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值