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

news2024/12/24 11:45:06

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

题目
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

解题思路
由于二叉搜索树的中序遍历是有序的,因此可以通过中序遍历逐步比较当前节点和前一个节点的值,更新最小差值。具体步骤如下:

  1. 初始化结果变量 res 为最大整数值,前一个节点 prenull
  2. 使用中序遍历对二叉搜索树进行递归遍历。
  3. 在中序遍历过程中,如果前一个节点 pre 不为空,则计算当前节点与 pre 节点值的差,并更新最小差值 res
  4. 将当前节点更新为 pre,继续遍历。
  5. 最后,返回 res 即为最小绝对差。

代码:

class Solution {
	private int res = Integer.MAX_VALUE;
	private TreeNode pre = null;
    public int getMinimumDifference(TreeNode root) {
       helper(root);
	   return res;

    }
	public void helper(TreeNode root){
		if (root==null){
			return;
		}
		helper(root.left);
		if(pre!=null){
			res = Math.min(res,root.val-pre.val);
		}
		pre = root;
		helper(root.right);
	}
}

501. 二叉搜索树中的众数

题目
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

解题思路
由于二叉搜索树的中序遍历是递增有序的,可以通过中序遍历来找到所有的众数。具体步骤如下:

  1. 变量初始化

    • 使用 maxCount 来记录出现次数的最大值。
    • count 记录当前节点值的出现次数。
    • pre 用于存储上一个访问的节点,以便判断当前节点是否与前一个节点的值相同。
  2. 中序遍历

    • 使用递归的中序遍历访问二叉搜索树的每个节点。
    • 如果当前节点的值与前一个节点相同,则增加 count
    • 如果不同,则将 count 重置为 1
  3. 更新众数列表

    • count 大于 maxCount 时,清空 modeList,更新 maxCount,并将当前值加入 modeList
    • 如果 count 等于 maxCount,则直接将当前值添加到 modeList
  4. 返回结果
    遍历完成后,将 modeList 转换为数组并返回。

代码

class Solution {
        List<Integer> modeList = new ArrayList<>();
        private int maxCount = 0;
        private int count = 0;
        private TreeNode pre = null;

        public int[] findMode(TreeNode root) {
            if (root == null) {
                return new int[0];
            }
            helper(root);

            int[] res = new int[modeList.size()];
            for (int i = 0; i < modeList.size(); i++) {
                res[i] = modeList.get(i);
            }
            return res;
        }

        public void helper(TreeNode root) {
            if (root == null) {
                return;
            }
            helper(root.left);

            // 更新当前节点的出现次数
            if (pre != null && pre.val == root.val) {
                count++;
            } else {
                count = 1;
            }

            // 更新 maxCount 和 modeList
            if (count > maxCount) {
                modeList.clear();
                maxCount = count;
                modeList.add(root.val);
            } else if (count == maxCount) {
                modeList.add(root.val);
            }

            pre = root;  // 更新 pre 为当前节点
            helper(root.right);
        }
    }

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

题目
给定一个二叉树,找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

解题思路
可以通过递归的方式查找两个节点的最近公共祖先。具体思路分为两种方法:

  1. 方法一:后序遍历递归查找,并利用布尔值返回节点位置。

    • 使用递归函数 helper 遍历树的每个节点。
    • 定义 leftrightmid 分别表示左子树、右子树是否包含 pq,以及当前节点是否是 pq
    • 当满足 (left && right) || (mid && left) || (mid && right) 时,当前节点为最近公共祖先,将其存入 node
    • 递归返回 mid || left || right,表示当前子树中是否包含 pq
  2. 方法二:递归分治法。

    • 从根节点开始递归查找 pq
    • 如果当前节点为空或等于 pq,则直接返回当前节点。
    • 递归查找左右子树,若 pq 分别位于左右子树,则当前节点为最近公共祖先。
    • 如果 pq 都在左子树或右子树中,则返回找到的子树根节点。

代码

class Solution {
	private TreeNode node = null;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
		if(root==null){
			return null;
		}
		boolean res = helper(root,p,q);
		return node;
    }
	public boolean helper(TreeNode root, TreeNode p, TreeNode q) {
		if(root==null){
			return false;
		}
		boolean left = helper(root.left,p,q);
		boolean right = helper(root.right,p,q);
		boolean mid = (root == p || root == q);

		if(left && right || left && mid || right && mid){
			node = root;
		}

		return mid || right || left;

	}
}
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) { // 若未找到节点 p 或 q
            return null;
        }else if(left == null && right != null) { // 若找到一个节点
            return right;
        }else if(left != null && right == null) { // 若找到一个节点
            return left;
        }else { // 若找到两个节点
            return root;
        }
    }
}

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

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

相关文章

Linux基础-常用操作命令详讲

Linux基础-常用操作命令详讲 一、openssl加密简单介绍 1. 生成加密的密码散列&#xff08;password hash&#xff09;​编辑 1.1 常见的选项总结表 1.2 加密参数详解 2. 自签名证书 3. 证书转换 二、文件管理 1. 创建空文件 ​编辑 2. 删除文件 4. 新建目录 ​编辑…

[大模型]视频生成-Sora简析

参考资料&#xff1a; Sora技术报告https://openai.com/index/video-generation-models-as-world-simulators/4分钟详细揭密&#xff01;Sora视频生成模型原理https://www.bilibili.com/video/BV1AW421K7Ut 一、概述 相较于Gen-2、Stable Diffusion、Pika等生成模型的前辈&am…

STM32学习笔记-外部中断和外部时钟

文章目录 EXTI基本结构AFIO 定时器1. STM32 定时器的种类2. 定时器的主要功能3. 定时器的配置4. 定时器 PWM 输出模式5. 定时器中断配置输出比较1. 输出比较模式概述2. 输出比较模式的配置今天实在有点疲惫了&#xff0c;明天继续学吧。 EXTI基本结构 AFIO 中断引脚选择&#…

【测试小白--如何写好测试用例--测试用例编写的方法+结合常见登录模块为实例--保姆级教学】

测试用例编写方法&登录模块实例 一、测试用例编写方法1. 等价类划分2. 边界值分析3. 状态转换测试4. 决策表测试5. 错误推测6. 用户场景测试7. 安全测试用例 二、登录模块测试用例实例1. 等价类划分2. 边界值分析3. 状态转换测试4. 决策表测试5. 错误推测6. 用户场景测试7.…

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

Ubuntu Linux

背景 Ubuntu起源于南非&#xff0c;其名称“Ubuntu”来源于非洲南部祖鲁语或豪萨语&#xff0c;意为“人性”、“我的存在是因为大家的存在”&#xff0c;这体现了非洲传统的一种价值观。Ubuntu由南非计算机科学家马克沙特尔沃斯&#xff08;Mark Shuttleworth&#xff09;创办…

yolov8涨点系列之轻量化主干网络替换

文章目录 YOLOv8 替换成efficientvit轻量级主干网络的好处计算效率提升模型部署更便捷方便模型移植 模型可扩展性增强便于集成其他模块支持模型压缩技术 主干网络替换1.创建yolov8_efficeintVit.py2.修改task.py(1)引入创建的efficientViT文件(2)修改_predict_once函数(3)修改p…

碧桂园服务启动“乘梯无忧”专项行动 携手业主共筑电梯安全新未来

摘要&#xff1a;全国400城8000项目全面覆盖 电梯是当代社会不可或缺的垂直交通工具&#xff0c;电梯安全问题不仅关系到居民的日常生活&#xff0c;更关乎到他们的生命财产安全。随着生活节奏的加快&#xff0c;居民对电梯的运行效率也有了更高的要求和期待。 碧桂园服务在2…

应对AI与机器学习的安全与授权管理新挑战,CodeMeter不断创新引领保护方案

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术正在快速发展&#xff0c;逐渐应用到全球各类主流系统、设备及关键应用场景中&#xff0c;尤其是在政府、商业和工业组织不断加深互联的情况下&#xff0c;AI和ML技术的影响日益广泛。虽然AI技术的…

【AI换装整合包及教程】OOTDiffusion: AI换装工具的革命性创新

引言 在当今这个数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的发展日新月异&#xff0c;从最初的语音识别、图像识别到现在的自然语言处理&#xff0c;AI的应用范围不断扩大&#xff0c;深刻地改变了我们的生活方式和工作模式。特别是在时尚界&#xff0c;…

全面解析:网络协议及其应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 全面解析&#xff1a;网络协议及其应用 文章目录 网络协议概述定义发展历程主要优势 主要网络协议应用层协议传输层协议网络层…

零基础‘自外网到内网’渗透过程详细记录(cc123靶场)——下

细节较多&#xff0c;篇幅较大&#xff0c;分为上/下两部分发布在两篇文章内 另一部分详见下面文章 零基础‘自外网到内网’渗透过程详细记录(cc123靶场)——上https://blog.csdn.net/weixin_62808713/article/details/143572185 八、第二层数据库服务器权限获取 猜到新闻资…

参数跟丢了之JS生成器和包装器

如需转载请注明出处.欢迎小伙伴一起讨论技术. 逆向网址:aHR0cHM6Ly91bmlvbi5qZC5jb20vcHJvTWFuYWdlci9pbmRleD9wYWdlTm89MQ 跟踪接口:aHR0cHM6Ly9hcGkubS5qZC5jb20vYXBp 跟踪参数:h5st 本文目标:记录学习下自定义的生成器和包装器,不做具体的参数加密逻辑分析 直接启动器进…

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

openGauss数据库-头歌实验1-5 修改数据库

一、查看表结构与修改表名 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;修改表名&#xff0c;并能顺利查询到修改后表的结构。 &#xff08;二&#xff09;相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.如何查看表的结构&#xff1b; 2.如…

linux 磁盘配额 quota

增加一个facl的的知识点&#xff1a; linux中默认的文件系统支持facl&#xff0c;如果是新挂载的分区&#xff0c;则不支持facl应用。需要在挂载文件系统时使用-o acl选项来启用facl支持。如下图显示 在/etc/fstab添加defaults,acl 1.启用磁盘配额功能&#xff1a;修改/etc/f…

进程和线程概念

进程 进程是系统进程资源分配和调度的一个独立单位。 进程的状态与转换 就绪 -> 阻塞 -> 执行 另外还有一个挂起操作&#xff0c;可将进程转入静止状态&#xff0c;知道激活操作&#xff0c;程序将恢复原有状态。 线程 线程更加轻量&#xff0c;作为调度和分派的基本…

三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/sql-databases/ SQL (关系型) 数据库 FastAPI不需要你使用SQL(关系型)数据库。 但是您可以使用任何您想要的关系型数据库。 这里我们将看到一个使用SQLModel的示例。 SQLModel是在SQLAlchemy和Pydantic的基础…

Java 并发编程学习笔记

参考资料&#xff1a; JAVA并发专题 - 终有救赎的专栏 - 掘金 Java并发编程学习路线&#xff08;建议收藏&#xfffd;&#xfffd;&#xff09; | Java程序员进阶之路x沉默王二 面试题目&#xff1a; JUC第一讲&#xff1a;Java并发知识体系详解 面试题汇总(P6熟练 P7精通…

Docker篇(基础命令)

目录 一、启动与停止 二、镜像相关的命令 1. 查看镜像 2. 搜索镜像 3. 拉取镜像 4. 删除镜像 三、容器创建与启动容器 1. 查看容器 2. 创建容器 交互式方式创建容器 守护式方式创建容器 3. 容器启动与停止 四、容器操作命令 1. 文件拷贝 2. 目录&#xff08;文件…