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

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

  • 二叉搜索树,用中序遍历

用一个全局变量result存储最小绝对差,prev指针存储

在中的逻辑里去更新result(保证prev不为空),然后更新prev=cur。

牢记谦虚遍历的顺序!pre紧跟在cur后面移动

class Solution {int result = Integer.MAX_VALUE;  //记录绝对差TreeNode prev = null;public void inorder(TreeNode cur) {if(cur == null) return;inorder(cur.left);//中if(prev!=null) {result = Math.min(result, Math.abs(prev.val-cur.val));}prev = cur; //进到下一层递归之前,prev就等于curinorder(cur.right);}public int getMinimumDifference(TreeNode root) {inorder(root);return result;}
}

501.二叉搜索树中的众数

  • 二叉搜索树,一定是中序遍历
  • 二叉搜索的性质,众数一定是连续出现的!—用双指针

怎么在一次遍历里找到maxCount和对应的数?

如果最后count=maxCount,就把这个元素放到result数组里。

定义全局变量

pre = null; int count = 0;   //count统计单个元素出现的频率
int maxCount = 0;   //统计遍历过的二叉树里元素出现的最高频率
List<Integer> result;
  1. 确定递归函数
void traversal(TreeNode cur)
  1. 终止条件
if(cur == null) return;
  1. 单层递归逻辑 中序 左中右

单层处理的逻辑:

  • 一进来先更新count,分为三种情况
  • 然后更新pre指针(此时pre就等于cur了)
  • 接着看目前的count是否大于maxCount了。相等就加入result,更大了就清空result然后加入
  • 为什么加的是cur.val而不是pre.val?下面这个时候,在count++完,pre还没更新的时候,cur是指向3的!此时count=2 所以到后面加入result数组的是cur.val!

在这里插入图片描述

traversal(cur.left);  //左//中 就是处理的逻辑
if(pre == null) {   //固定操作,说明刚开始遍历 cur指向第一个元素count = 1;
}else if(pre.val == cur.val) {  //pre不为空了,这个元素重复出现了count++;
}else {  //说明当前数值不相等了 cur第一次出现 count重置为1count = 1;
}
pre = cur;  //更新pre,跟着cur移动
if(count == maxCount) result.add(cur.val);  //如果这个数出现频率和maxCount相等,放进去
else if(count > maxCount) {maxCount = count;  //更新maxCountresult.clear();  //清空result数组,之前旧的元素都不对了!result.add(cur.val);
}traversal(cur.right);  //右

所谓的双指针就是,pre先初始化为null,两个指针同步遍历(pre更新就直接pre=cur)

通过判断count是否大于maxCount来添加元素,如果大于了就清空重新放。

  • 完整代码
class Solution {List<Integer> result = new ArrayList<>();TreeNode pre = null;int maxCount = 0;int count = 0;public void traversal(TreeNode cur) {if(cur == null) return;traversal(cur.left);if(pre == null) {count = 1;}else if(pre.val == cur.val) {count++;}else {count = 1;}pre = cur;if(count == maxCount) {result.add(cur.val);}else if(count > maxCount) {maxCount = count;result.clear();result.add(cur.val);}traversal(cur.right);}public int[] findMode(TreeNode root) {traversal(root);int[] res = new int[result.size()];for (int i = 0; i < result.size(); i++) {res[i] = result.get(i);}return res;}
}

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

注意:一个节点也可以是它自己的祖先

  • 怎么从下往上遍历?

回溯啊!后序遍历的回溯过程。

判断某一个节点,左子树有没有出现过p,右子树有没有出现过q

只要左右子树出现了p和q就往上返回,如果左不为空右不为空的话就是最近的公共祖先

第二种情况:自己是自己的祖先

  1. 递归函数
TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
  1. 确定终止条件

遇到空了 or 遇到了p或q,返回

if(root == null) return root;
if(root == p || root == q) return root;
  1. 单层递归逻辑 后序左右中
left = traversal(root.left,p,q); //相当于告诉我们左子树有没有出现过p q
right = traversal(root.right,p,q);//左右都不为null 说明是公共祖先,往上返回
if(left!=null && right!=null) return root;
//左空右不为空,继续把右子树的往上返回
else if(left == null && right!=null) return right;
else if(left != null && right == null) return left;
else return null;
  • 其实已经包含了第二种情况!遇到了自身是公共祖先的,就直接return root了,不去遍历下面的了!
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null) return root;if(root == p || root == q) return root;TreeNode left = lowestCommonAncestor(root.left,p,q); //相当于告诉我们左子树有没有出现过p qTreeNode right = lowestCommonAncestor(root.right,p,q);//左右都不为null 说明是公共祖先,往上返回if(left!=null && right!=null) return root;//左空右不为空,继续把右子树的往上返回else if(left == null && right!=null) return right;else if(left != null && right == null) return left;else return null;}
}

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

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

相关文章

多层陶瓷电容器(MLCC)的基本结构与特点

多层陶瓷电容器&#xff08;MLCC&#xff09;是一种电子元件&#xff0c;用于存储电荷和调节电路中的电容值。它们由多个陶瓷层组成&#xff0c;每个层之间夹有金属电极&#xff0c;然后堆叠在一起&#xff0c;并在两端连接上导体引线&#xff0c;形成一个整体结构。在外部通常…

QML | JavaScript作用域和命名解析2

QML | JavaScript作用域和命名解析3.绑定的作用域对象 属性绑定是QML中最常见的JavaScript应用。属性绑定关联了一个JavaScript表达式的结果和对象的一个属性,该属性所归属的对象被称为绑定的作用域对象。在下面的代码中,Item对象就是一个绑定的作用域对象: ​ 绑定可以…

本地运行环境工具UPUPWANK(win)和Navicat数据库管理工具

UPUPWANK安装地址&#xff1a;https://www.upupw.net 1.进入UPUPWANK后点击一键开启 2.新增项目 这里请千万注意80端口&#xff0c;如果80端口被占用了&#xff0c;请记住去任务管理器关闭占用80端口的进程。不然就不会成功显示。&#xff08;笔者含泪警告&#xff0c;一晚上的…

PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第48讲&#…

javaSSM公司招聘管理系统IDEA开发mysql数据库web结构计算机java编程maven项目

一、源码特点 IDEA开发SSM公司招聘管理系统是一套完善的完整企业内部系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;MAVEN方式加 载&#xff0c;系统具有完整的源代码和…

设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 开篇&#xff1a; 欢迎来到设计模式的神秘…

最小割问题合集,最大权闭合图,最大密度子图,最小权点覆盖,最大权独立子图,OJ练习,代码详解

文章目录 零、回顾1、流网络的割2、最小割问题 一、最小割的应用1.1POJ1966 -- Cable TV Network1.1.1原题链接1.1.2思路分析1.1.3AC代码 1.2ZOJ 2676 Network Wars1.2.1原题链接1.2.2思路分析1.2.3AC代码 1.3OPTM - Optimal Marks1.3.1原题链接1.3.2思路分析1.3.3AC代码 二、最…

ApiPost设置多人协作

有时候一个项目会有多个人一起编写&#xff0c;每个人都有自己的接口&#xff0c;ApiPost提供了一个多人协作功能&#xff0c;可以在一个项目里加入多个成员&#xff0c;每个人新增的接口都可以在项目中看到&#xff0c;从而提高开发效率。 我这边用的是ApiPost7&#xff0c;首…

深入探讨iOS开发:从创建第一个iOS程序到纯代码实现全面解析

iOS开发作为移动应用开发的重要领域之一&#xff0c;对于开发人员具有重要意义。本文将深入探讨iOS开发的各个方面&#xff0c;从创建第一个iOS程序到纯代码实现iOS开发&#xff0c;带领读者全面了解iOS应用程序的开发流程和技术要点。 &#x1f4f1; 第一个iOS程序 在创建第…

【蓝桥杯】tarjan算法

一.概述 Tarjan 算法是基于DFS的算法&#xff0c;用于求解图的连通性问题。 Tarjan 算法可以在线性时间内求出&#xff1a; 无向图&#xff1a; 割点与桥双连通分量 有向图&#xff1a; 强连通分量必经点与必经边 1.割点&#xff1a; 若从图中删除节点 x 以及所有与 x 关联的…

【c++】类和对象(四)深入了解拷贝构造函数

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;本篇内容带大家深入了解拷贝构造函数 目录 1.拷贝构造函数1.1传值调用的无限调用1.2浅拷贝1.3深拷贝1.4深拷贝的实现 1.拷贝构造函数 拷贝构造函数是一种特殊的…

Java版企业电子招标采购系统源码——鸿鹄电子招投标系统的技术特点

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…

【Java面试题】计算机网络

文章目录 1.计算机网络基础1.1网络分层模型/OSI七层模型是什么&#xff1f;1.2TCP/IP四层模型是什么&#xff1f;每一层的作用&#xff1f;1.2.1TCP四层模型&#xff1f;1.2.2为什么网络要分层&#xff1f; 1.2常见网络协议1.2.1应用层常见的协议1.2.2网络层常见的协议 2.HTTP2…

解决华为云服务器宝塔面板无法访问显示“此站点的连接不安全”问题

已经配置好安全组以及初始化宝塔面板&#xff0c;还是无法访问镜像管理页面&#xff0c;提示此站点的连接不安全。 解决方案 将地址https改为http即可进入。 成功登录后&#xff0c;开启面板SSL即可。

js实现拖放效果

dataTransfer对象 说明&#xff1a;dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性&#xff0c;所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部&#xff0c;可以使用这个对象的属性和方法实现拖放功能…

科学认识并正确运用人工智能技术赋能国际传播

以下文章来源&#xff1a;学习时报 加强国际传播能力建设&#xff0c;全面提升国际传播效能&#xff0c;形成同我国综合国力和国际地位相匹配的话语权&#xff0c;已成为实现中国式现代化需要解决好的一个重大问题。文生视频模型Sora&#xff0c;是继ChatGPT之后又一推动传播智…

鉴源论坛丨形式化工程方法之需求建模(下)

作者 | 杨坤 上海控安可信软件创新研究院系统建模组 版块 | 鉴源论坛 观模 引言&#xff1a;需求建模是一种从源头确保软件质量的重要手段。需求建模可分为需求规约和需求确认两个部分&#xff0c;前者通过严格设计的形式化语言精确地将需求文档转换为了形式化规约&#xff0…

手撕LRU 最近最少使用缓存淘汰策略 + LinkedHashMap

LRU 最近最少使用缓存淘汰策略 1 LRU 算法就是一种缓存淘汰策略2 手撕LRU3 LinkedHashMap 常见面试题 1 LRU 算法就是一种缓存淘汰策略 计算机的缓存容量有限&#xff0c;如果缓存满了就要删除一些内容&#xff0c;给新内容腾位置。但问题是&#xff0c;删除哪些内容呢&#x…

“Kimi概念”降温,长文本“担不起”大模型的下一步

Kimi火了…… 这是这波AI浪潮中&#xff0c;国内创业公司第一次真正“破圈”。最明显的标志是&#xff0c;在二级市场中&#xff0c;Kimi已被市场作为一个概念板块来对待&#xff0c;它们被称之为“Kimi概念股”。在之前爆炒的板块中&#xff0c;可能有华为产业链、苹果产业链&…

SV-7045VP sip网络草坪音箱 室外网络广播POE供电石头音箱

SV-7045VP sip网络草坪音箱 室外网络广播POE供电石头音箱 18123651365微信 SV-7045VP SIP网络草坪音箱 sip POE石头音箱 描述 SV-7041VP是深圳锐科达电子有限公司的一款防水网络草坪音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出…