代码随想录 day21

二叉搜索树

二叉搜索树的最小绝对差
题意:求树中任意两不同节点值之间的最小差值 。
思路:这回要使用前后指针了。
使用两个指针(前指针和后指针),对指向的结点的值进行相减,如果值大于maxlen就更新这个值。
核心代码

void trival(TreeNode* root){if(root == nullptr){return ; }trival(root->left) ; cur = root ; if(prev){int dif = abs(cur->val - prev->val );if(dif < mindif ){mindif = dif  ; }}prev = cur ; trival(root->right) ; }

二叉搜索树中的众数
题意:是找到频率最高的元素 。
思路:我没有做到不用额外的空间的最优算法 。 由于我想一步做多步。
只是使用map<int ,int> 键作为每个节点的值,值为每个节点的值出现的次数 。
使用前序遍历将整个树遍历。之后把map的元素放入到vector<pair<int,int >> 对其进行排序,最后输出频率最高的数。
核心代码

class Solution {
public:vector<pair<int , int>> res ;   // 存储当前TreeNode * pre = nullptr ; int l = 0  , r =0  ;int maxlen = 0 ; map<int ,int > m ; void trival(TreeNode * cur){if(cur == nullptr) {return ; } trival(cur->left) ;m[cur->val] ++ ; trival(cur->right) ; }struct comp{bool operator()(const pair<int,int> & lhs ,const  pair<int ,int >   & rhs){return lhs.second > rhs.second ; }} ; vector<int> findMode(TreeNode* root) {vector<int> tres ;if(root && root->val == 0&& root->left == nullptr && root->right == nullptr){tres.push_back(0) ; return tres ; } trival(root);for(auto it : m){res.push_back(it) ;  }sort(res.begin() ,res.end(), comp() ) ; tres.push_back(res[0].first) ; cout<<res.size()<<endl ; for(int i = 0 ; i< res.size() ; ++ i){if(i>0){if(res[i].second == res[i-1].second){tres.push_back(res[i].first) ; }else{break ; }}}return tres ; }
};

不用额外空间的的思路: 由于搜素二叉树的性质,我们使用中序遍历可以做到,使用一个cnt来计数相同的元素。在中序遍历的过程中递归体每前一个元素和现在的元素不一样了,那么这个cnt重新等于1。并且看是否更新值。同时需要清空vector< int > res 因为 这个只存最大的元素。 我们也是贪婪地寻找。最后一定会找到频率最高的元素。 如果当前得到的cnt == maxlen 就将这个元素加入res.
总结:解题的步骤,一个阶段只做一件事。 就比如这道题,我已经想到用搜索二叉树的性质,但是在计数的时候我想的是双指针法,这就比直接计数复杂了, 并且难以操作,就放弃了。 因此要不拘于一种方法。简单的计数也是可以使用的。
核心代码

    void trival(TreeNode* root){if(root== nullptr){return ; }trival(root->left) ;if(pre == nullptr) // 当pre等于null {cnt = 1 ; }else if(pre->val == root->val){cnt++ ; }else if(pre->val != root->val){cnt = 1 ; // 重新计算相同的数}if(cnt> maxlen) // 当这个值的数量大于原先的值的个数时,那么{maxlen = cnt ; res.clear() ;res.push_back(root->val) ; }else if(cnt == maxlen) // 当cnt等于maxlen时。就{res.push_back(root->val) ; }pre = root ; trival(root->right) ; }

二叉树的最近公共祖先
是一个难题:
1被卡哥说的,我直接看视频 。
但是其实没有那么难;
注意:1.以前也做过从下往上遍历的题; 就是使用后序遍历, 先到叶子结点后,再返回上一层递归。当然返回类型是TreeNode * ; 以便于判断;
2.本层递归要做什么其实就是我这个递归要做什么:要判断左右子树是否包含p或q节点。 如果包含那么就返回本节点到上层递归。
3.递归边界:当节点是null时,就返回,当节点找到了p或者q就返回。
核心代码

  TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q){if(root == NULL){return NULL ; }   if(root == p || root == q) // 边界条件 , 遇到p 或 q 就返回本节点 。 {return root ; } TreeNode * left =  lowestCommonAncestor(root->left , p , q) ; TreeNode * right = lowestCommonAncestor(root->right , p ,q) ;if(left && right ) return root ; // 如果从左子树有值 。 并且右子树有值  ; 如果左子树和右子树都找到了值那么本节点就是最近公共祖先节点。 if(left && right == NULL) return left ; // 如果左子树有值,就返回左子树的值 。 因为在左子树找到了值 。  if(left == NULL && right ) return right ;  // return NULL ; }

另外总结:
1.求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。

2.在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。

3.要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。 因为是层层往上递归返回

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

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

相关文章

【小呆的力学笔记】连续介质力学的知识点回顾一:运动和变形

文章目录 1. 运动的描述2. 拉格朗日描述下的变形2.1 线元的变化2.2 体元的变化2.3 面元的变化 1. 运动的描述 在连续介质力学中&#xff0c;存在着两种对运动的描述&#xff0c;一种为拉格朗日描述&#xff0c;即通过描述每个物质点的运动来描述整个变形体的运动&#xff0c;也…

如何将音频中的人声分离出来?

想要把一段视频中的人声跟背景音乐分离开来&#xff0c;找个好一点的音频处理软件就能把声音分离了&#xff0c;常见的有以下方法&#xff0c;一起来看看吧。 pr 打开软件&#xff0c;然后将电脑上的音频文件&#xff0c;上传到软件中&#xff0c;然后按住[ctrla]选择所有音频…

【数据结构】 排序算法 ~ 总结篇

文章目录 1. 排序几个重点概念的理解2. 排序算法的分析&#x1f427; 1. 排序几个重点概念的理解 2. 排序算法的分析&#x1f427;

Git学习篇

目录 使用命令导入项目 使用命令导入项目 1. 使用git init 命令初始化一个新的Git仓库。 git init 是 Git 命令&#xff0c;用于初始化一个新的 Git 仓库。当您想要开始跟踪一个新项目的版本控制时&#xff0c;可以运行 git init 命令来初始化一个空的 Git 仓库。 如果出现以下…

6-继承

6-继承 1、基本语法和方式2、继承的基本特点2.1 三种继承方式相同的基本点2.2 三种继承方式的差别2.3 公有继承的独有特点 3、子类的构造、析构3.1 子类的构造3.2 子类的析构3.3 子类的拷贝构造函数3.4 子类的拷贝赋值 4、多重继承4.1 内存布局4.2 类型转换4.3 名字冲突问题 5、…

10. C++异步IO处理库和使用libevent实现高性能服务器

C比较有名的异步IO处理库 libevent 这个主要使用的是epoll。libevthplibuvlibev 我们主要介绍libevent。 libevent重要函数 event_base_new 这个可以对应于epoll_create也就是创建一个实例。还可以初始化libevent所有管理相关的代码。比如说所能用到的队列&#xff0c;栈&a…

电脑重装系统的PE工具

10款PE制作工具&#xff01;一键制作U盘启动盘&#xff0c;轻松制作系统盘&#xff0c;重装系统&#xff0c;免费纯净、无捆绑。 二、资源/简介 1.微PE工具箱 非常老牌的PE工具&#xff0c;装机维护得力的助手&#xff0c;最后的救命稻草。化繁为简&#xff0c;小材大用&…

【GPT‑4o】完整教程:LORA微调LLaMA3并结合RAG和Agent技术实现Text2SQL任务

完整教程&#xff1a;LORA微调LLaMA3并结合RAG和Agent技术实现Text2SQL任务 环境准备 首先&#xff0c;安装必要的Python包&#xff1a; pip install transformers peft datasets torch faiss-cpu加载LLaMA3模型 从Hugging Face加载LLaMA3模型和对应的tokenizer&#xff1a…

算法基础之集合-Nim游戏

集合-Nim游戏 核心思想&#xff1a; 博弈论 sg函数&#xff1a;在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1,y2,yk,定义SG(x)的后记节点y1,y2,,yk的SG函数值构成的集合在执行mex运算的结果,即:SG(x)mex({SG(y1),SG(y2)SG(yk)}) **特别地,**整个有向图…

Linux内核编译流程3.10

一、内核源代码编译流程 编译环境&#xff1a; cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) Linux内核版本&#xff1a; uname -r 3.10.0-693.el7.x86_64 编译内核源代码版本&#xff1a;linux-4.19.90-all-arch-master cp /boot/config-xxx到内核源…

数据库(9)——DQL基础查询

数据查询 数据查询是SQL中最复杂的&#xff0c;语法结构为 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后字段列表 ORDER BY 排序字段列表 LIMIT 分页参数 查询多个字段 SELECT 字段1&#xff0c;字段2...FROM…

领域驱动设计(DDD)学习笔记之:战略设计

限界上下文&#xff08;Bounded Context&#xff09; 上下文边界的确定 在领域驱动设计&#xff08;DDD&#xff09;中&#xff0c;限界上下文&#xff08;Bounded Context&#xff09;是定义领域模型边界的核心概念。明确和定义上下文边界是DDD战略设计中的重要步骤。正确地…

Spring Cloud:微服务架构的基石

目录 微服务架构简介 Spring Cloud 简介 Spring Cloud 组件详解 Eureka 服务注册与发现 Ribbon 负载均衡 Feign 声明式 HTTP 客户端 Hystrix 服务容错保护 Zuul 网关 Config 配置管理 Sleuth 链路追踪 Spring Cloud Stream 消息驱动 Spring Cloud 与 Docker 的结合 …

LeetCode583:两个字符串的删除操作

题目描述 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 代码 解法1 /*dp[i][j]&#xff1a;以i-1为结尾的wrod1中有以j-1为尾的word2的个数为了让word1和word2相同&#xff0c;最少操作…

linux开发之设备树基本语法一

设备树的根节点 设备树子节点和子子节点,子节点在根节点范围内 包含子节点以及子子节点 节点名称 比如这里led就是这个gpio的小名,可以直接用 gpio22020101是这里的名字,也就是要用这个gpio,符号后面的一串数字使用了这个gpio的寄存器地址,因为可能会用很多gpio,所以加入寄存…

Linux完整版命令大全(二十二)

uux 功能说明&#xff1a;在远端的UUCP主机上执行指令。语  法&#xff1a;uux [-bcCIjlnrvz][-a<地址>][-g<等级>][-s<文件>][-x<层级>][--help][指令]补充说明&#xff1a;uux可在远端的UUCP主机上执行指令或是执行本机上的指令&#xff0c;但在执…

Pushmall共享分销电商SaaS版2024年 5月模块开发优化完成

Pushmall共享分销电商 2024年 5月模块开发优化完成 1、**实现SaaS框架业务&#xff1a;**多租户、多商家、多门店&#xff0c;及商家入驻、商品管理。 2、租户小程序管理&#xff1a;对租户的小程序业务管理。 3、店铺小程序管理&#xff1a;对租户多店铺小程序绑定。 4、会员分…

新火种AI|警钟长鸣!教唆自杀,威胁人类,破坏生态,AI的“反攻”值得深思...

作者&#xff1a;小岩 编辑&#xff1a;彩云 在昨天的文章中&#xff0c;我们提到了谷歌的AI Overview竟然教唆情绪低迷的网友“从金门大桥跳下去”。很多人觉得&#xff0c;这只是AI 模型的一次错误判断&#xff0c;不会有人真的会因此而照做。但现实就是比小说电影中的桥段…

精酿啤酒:品质与口感对啤酒市场价格的影响

啤酒作为一种大众化的产品&#xff0c;其品质与口感对市场价格有着显著的影响。对于Fendi club啤酒而言&#xff0c;其卓着的品质和与众不同的口感又加上市场价格相对实惠&#xff0c;受到消费者的青睐。 品质是决定啤酒市场价格的重要因素。Fendi club啤酒选用天然小麦原料&am…

【leetcode2765--最长交替子数组】

要求&#xff1a;给定一个数组&#xff0c;找出符合【x, x1,x,x-1】这样循环的最大交替数组长度。 思路&#xff1a;用两层while循环&#xff0c;第一个while用来找到符合这个循环的开头位置&#xff0c;第二个用来找到该循环的结束位置&#xff0c;并比较一下max进行记录。 …