当前位置: 首页 > news >正文

leetcode刷题day18|二叉树Part06( 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先)

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

二叉搜索树的中序遍历是有序的。

思路:建立一个指针存放前一个节点;一个全局变量result存储结果。计算当前节点与前一个节点的差值,记录最小的差值。

中序遍历递归三步曲:
1、传入参数:根节点,无返回值
2、终止条件:当节点为空时,return。
3、递归逻辑:递归调用左子树;如果前一个节点不为空,计算差值并比较差值与result;将当前节点赋值给前一个节点;递归调用右子树。
代码如下:

class Solution {int result;TreeNode pre;public int getMinimumDifference(TreeNode root) {result=Integer.MAX_VALUE;getMinDiff(root);return result;}public void getMinDiff(TreeNode root){if(root==null) return;getMinDiff(root.left);if(pre!=null){result=Math.min(result,root.val-pre.val);}pre=root;getMinDiff(root.right);}
}

501.二叉搜索树中的众数

首先想到的把二叉树全部遍历一遍,将元素和出现的次数使用HashMap存放,排序后输出出现次数靠前的元素。但这样没有用到二叉搜索树的特殊属性且需要额外的空间。

所以考虑中序遍历递归,遍历得到的元素是从小到大按顺序排列的,记录元素出现的次数,并使用一个最大次数记录出现的最多的次数。如果元素出现的次数等于最大次数,则将当前元素加入集合中;如果大于最大次数,则清空集合中的元素,将当前元素加入。

递归三部曲:
1、传入参数:root;定义全局变量元素列表,所以不需要返回值;
2、终止条件:节点为空,return
3、递归函数逻辑:递归调用左节点,中间节点逻辑:如果前一个节点p re为空或者当前节点不等于前一个节点,count=1重新计数;否则count++;如果元素出现的次数等于最大次数,则将当前元素加入集合中;如果大于最大次数,更新最大次数,则清空集合中的元素,将当前元素加入。递归调用右节点。

代码

class Solution {List<Integer> list;TreeNode pre;int count;int maxCount;public int[] findMode(TreeNode root) {list=new ArrayList<>();count=0;maxCount=0;findMode1(root);int[] res=new int[list.size()];for(int i=0;i<list.size();i++){res[i]=list.get(i);}return res;}public void findMode1(TreeNode root){if(root==null) return;findMode1(root.left);if(pre==null || root.val!=pre.val){count=1;}else count++;if(count>maxCount){maxCount=count;list.clear();list.add(root.val);}else if(count==maxCount){list.add(root.val);}pre=root;findMode1(root.right);}
}

注意:要写清判断逻辑,不然会重复加元素。

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

要找最近公共祖先,最好的方法就是从下往上遍历,后序遍历就很适合。

存在两种情况,一种情况是p,q分别在左右两棵子树上,此时遇到p返回p,遇到q返回q,当左右子树都有返回值时该中间节点即为最近的公共祖先。第二种情况是p或q本身就是公共祖先,返回当前节点即可。第一种情况的逻辑已经包含了第二种情况。

递归三步曲:
1、输入参数:root,p,q,返回值为节点类型
2、终止条件:节点为null,p,q,直接返回节点。
3、递归函数逻辑:递归调用左子树,递归调用右子树,如果left 和 right都不为空,说明此时root就是最近公共节点;如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。

代码:

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null || root==p || root==q) return root;TreeNode left=lowestCommonAncestor(root.left,p,q);TreeNode right=lowestCommonAncestor(root.right,p,q);if(left!=null && right!=null){return root;}else if(left!=null && right==null){return left;}else if(left==null && right!=null){return right;}else{return null;}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • 演示:基于WPF的自绘的中国地铁轨道控件
  • 相图的科学应用,陶瓷材料创新
  • Centos挂载和删除nfs
  • 滑动窗口算法—字符串的排列
  • linux驱动开发-地址映射
  • uniapp小程序,使用腾讯地图获取定位
  • Vue组件:依赖注入provide和inject的使用
  • Python中的单例模式:从入门到精通
  • 【秋招笔试】9.09阿里国际秋招(已改编)-三语言题解
  • Hadoop Pig
  • Vue3+setup+el-pagination+el-select封装下拉分页及懒加载
  • git:分支管理
  • 如果java垮了其他语言社区就遭殃了,这个说法可信吗?
  • ffmpeg编译连接报错 undefined reference to `uncompress‘
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • android图片蒙层
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Java多态
  • js写一个简单的选项卡
  • js中forEach回调同异步问题
  • python3 使用 asyncio 代替线程
  • React 快速上手 - 07 前端路由 react-router
  • Sublime text 3 3103 注册码
  • 测试如何在敏捷团队中工作?
  • 如何进阶一名有竞争力的程序员?
  • 如何在 Tornado 中实现 Middleware
  • 怎么把视频里的音乐提取出来
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • # Redis 入门到精通(九)-- 主从复制(1)
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (二)原生js案例之数码时钟计时
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (九十四)函数和二维数组
  • (一)kafka实战——kafka源码编译启动
  • .JPG图片,各种压缩率下的文件尺寸
  • .Net Core 中间件与过滤器
  • .net 生成二级域名
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】
  • @Autowired标签与 @Resource标签 的区别
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @EnableWebSecurity 注解的用途及适用场景
  • @ModelAttribute 注解
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [Android]使用Android打包Unity工程
  • [C#学习笔记]注释