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

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

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

题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/
文档讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html
视频讲解:https://www.bilibili.com/video/BV1DD4y11779

思路

  • 使用了中序遍历的递归法,因为中序遍历出来是一个递增的数组,然后计算每一个差值,找到差值的最小值。
  • 在计算差值时,用双指针进行遍历。

代码

class Solution {int min = Integer.MAX_VALUE;TreeNode pre;public int getMinimumDifference(TreeNode root) {getMin(root);return min;}public void getMin(TreeNode root) {int res;if (root == null) return;getMin(root.left);if (pre != null) {res = Math.abs(pre.val - root.val);min = Math.min(res, min);}pre = root;// 将pre的值移到root上,保存了上一个节点。getMin(root.right);}}

501.二叉搜索树中的众数

题目链接:https://leetcode.cn/problems/find-mode-in-binary-search-tree/
文档讲解:https://programmercarl.com/0501.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E4%BC%97%E6%95%B0.html
视频讲解:https://www.bilibili.com/video/BV1fD4y117gp

思路

  • 还是用中序遍历来得到一个递增的数组。用双指针来记录上一个节点和当前节点,避免使用额外空间。
  • 在中的逻辑中,如果pre为空,说明前面没有节点,将count置为1;如果pre和root的值相等,将count加一;如果不相等,就将count置为1。
  • 然后判断当前count和maxCount之间的关系,如果count大,就更新maxCount的值,并且清空之前的数组,加入当前值。如果相等,直接把当前值加入数组。

代码

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

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

题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/
文档讲解:https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html
视频讲解:https://www.bilibili.com/video/BV1jd4y1B7E2

思路

  • 用后序遍历,能体现回溯的思路,左右节点传回包含p或q的节点。
    • 如果某个节点的左右节点都有值,说明左右都包含p和q,那么该节点就是最近公共祖先;
    • 如果只有左节点有值,就把左节点向上返回;如果只有右节点有值,就把左节点向上返回;
    • 当节点为空或等于p或q,就返回当前节点,递归结束。

代码

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

相关文章:

  • NLP技术发展和相关书籍分享
  • MTK Android9.0 给vendor下文件夹权限,用于读取文件列表
  • 成都蓝蛙科技引领AIGC创新,亮相中国AIGC开发者大会
  • Java研学-RBAC权限控制(七)
  • 【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结
  • docker system prune命令详解
  • Docker安装Oracle11g数据库
  • 关于学习Go语言的并发编程
  • 嘴尚绝卤味:健康美味新选择,开启味蕾新旅程!
  • rust语言初识
  • phpstudy配置网站伪静态
  • 景源畅信电商:做抖音运营怎么开始第一步?
  • 循序渐进Docker Compose
  • SEC批准以太坊ETF了吗?
  • react 使用 Reducer 和 Context 进行纵向扩展
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 4个实用的微服务测试策略
  • JavaScript DOM 10 - 滚动
  • Javascript编码规范
  • JAVA多线程机制解析-volatilesynchronized
  • Java方法详解
  • Laravel Telescope:优雅的应用调试工具
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • oschina
  • React+TypeScript入门
  • Vue--数据传输
  • 服务器之间,相同帐号,实现免密钥登录
  • 猴子数据域名防封接口降低小说被封的风险
  • 前言-如何学习区块链
  • 如何选择开源的机器学习框架?
  • 我有几个粽子,和一个故事
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 湖北分布式智能数据采集方法有哪些?
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #include到底该写在哪
  • #QT(一种朴素的计算器实现方法)
  • (floyd+补集) poj 3275
  • (定时器/计数器)中断系统(详解与使用)
  • (二)WCF的Binding模型
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (含笔试题)深度解析数据在内存中的存储
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (七)c52学习之旅-中断
  • (算法二)滑动窗口
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .NET Core中Emit的使用
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 依赖注入和配置系统
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET命令行(CLI)常用命令