二叉搜索树题目:二叉搜索树的最近公共祖先

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:二叉搜索树的最近公共祖先

出处:235. 二叉搜索树的最近公共祖先

难度

3 级

题目描述

要求

给定一个二叉搜索树,找到该树中两个指定结点的最近公共祖先。

最近公共祖先的定义为:两个结点 p \texttt{p} p q \texttt{q} q 的最近公共祖先是满足 p \texttt{p} p q \texttt{q} q 都是其后代的最低的结点 T \texttt{T} T(一个结点也可以是它自己的祖先)。

示例

示例 1:

示例 1

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 \texttt{root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8} root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 \texttt{6} 6
解释:结点 2 \texttt{2} 2 和结点 8 \texttt{8} 8 的最近公共祖先是结点 6 \texttt{6} 6

示例 2:

示例 2

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 \texttt{root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4} root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2 \texttt{2} 2
解释:结点 2 \texttt{2} 2 和结点 4 \texttt{4} 4 的最近公共祖先是结点 2 \texttt{2} 2。因为根据定义最近公共祖先结点可以为结点本身。

示例 3:

输入: root = [2,1], p = 2, q = 1 \texttt{root = [2,1], p = 2, q = 1} root = [2,1], p = 2, q = 1
输出: 2 \texttt{2} 2

数据范围

  • 树中结点数目在范围 [2, 10 5 ] \texttt{[2, 10}^\texttt{5}\texttt{]} [2, 105]
  • -10 9 ≤ Node.val ≤ 10 9 \texttt{-10}^\texttt{9} \le \texttt{Node.val} \le \texttt{10}^\texttt{9} -109Node.val109
  • 所有 Node.val \texttt{Node.val} Node.val 各不相同
  • p ≠ q \texttt{p} \ne \texttt{q} p=q
  • p \texttt{p} p q \texttt{q} q 均存在于给定的二叉搜索树中

解法一

思路和算法

如果结点 p p p q q q 之间的关系是祖先和后代的关系,则其中的祖先即为最近公共祖先。如果结点 p p p q q q 之间的关系不是祖先和后代的关系,则结点 p p p q q q 分别在最近公共祖先的两个子树中。

对于二叉搜索树中的任意结点,其左子树中的结点值都小于当前结点值,其右子树中的结点值都大于当前结点值。首先比较根结点值和结点 p p p q q q 的结点值,缩小寻找最近公共祖先的范围。

  • 如果根结点值比结点 p p p q q q 的结点值都大,则结点 p p p q q q 都在根结点的左子树中,因此根结点的左子结点一定是结点 p p p q q q 的公共祖先,应该在根结点的左子树中寻找最近公共祖先。

  • 如果根结点值比结点 p p p q q q 的结点值都小,则结点 p p p q q q 都在根结点的右子树中,因此根结点的右子结点一定是结点 p p p q q q 的公共祖先,应该在根结点的右子树中寻找最近公共祖先。

  • 如果根结点值介于结点 p p p 和结点 q q q 的结点值之间(可以等于其中的一个结点值),则根结点的任何一个子结点都不可能是结点 p p p q q q 的公共祖先,因此根结点是结点 p p p q q q 的最近公共祖先。

上述过程是一个递归的过程。递归的终止条件是当前结点值介于结点 p p p 和结点 q q q 的结点值之间,此时当前结点是结点 p p p q q q 的最近公共祖先,返回当前结点。对于其余情况,定位到最近公共祖先所在的子树,对该子树调用递归。

由于结点 p p p q q q 都存在于给定的二叉搜索树中,因此最近公共祖先一定存在。

代码

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {int maxVal = Math.max(p.val, q.val);int minVal = Math.min(p.val, q.val);if (root.val <= maxVal && root.val >= minVal) {return root;}return root.val > maxVal ? lowestCommonAncestor(root.left, p, q) : lowestCommonAncestor(root.right, p, q);}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。时间复杂度取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)

解法二

思路和算法

递归实现可以改成迭代实现。从根结点开始搜索,如果当前结点值结点值比结点 p p p q q q 的结点值都大或者都小,则执行如下操作,直到当前结点值介于结点 p p p 和结点 q q q 的结点值之间。

  • 如果当前结点值比结点 p p p q q q 的结点值都大,则结点 p p p q q q 都在当前结点的左子树中,因此将当前结点移动到左子结点。

  • 如果当前结点值比结点 p p p q q q 的结点值都小,则结点 p p p q q q 都在当前结点的右子树中,因此将当前结点移动到右子结点。

搜索结束时,当前结点为结点 p p p q q q 的最近公共祖先,返回当前结点。

由于结点 p p p q q q 都存在于给定的二叉搜索树中,因此最近公共祖先一定存在。

代码

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {int maxVal = Math.max(p.val, q.val);int minVal = Math.min(p.val, q.val);TreeNode node = root;while (node.val > maxVal || node.val < minVal) {if (node.val > maxVal) {node = node.left;} else {node = node.right;}}return node;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。时间复杂度取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( 1 ) O(1) O(1)

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

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

相关文章

CSP-202209-1-如此编码

CSP-202209-1-如此编码 解题思路 核心逻辑在于利用arr1和arr2两个数组来逐步计算出每个c[i]被使用的次数&#xff0c;这些次数即为题目中的b[i]。arr1[i] m % c[i]用于计算在用c[i]整除m后的余数&#xff0c;这个余数表示在当前级别i上&#xff0c;m还需要多少才能被c[i]整除…

Linux--- vim详解

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 “学如逆水行舟&#xff0…

如何配置SSH实现无公网ip远程连接访问Deepin操作系统

&#x1f4d1;前言 本文主要是配置SSH实现无公网ip远程连接访问Deepin操作系统的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️** &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &…

CAN通信----(创芯科技)CAN分析仪----转CANTest使用

点击进入官方链接进行下载创芯科技 CAN分析仪资料包&#xff1a; 创芯科技的官网&#xff1a;https://m.zhcxgd.com/ 我使用的是至尊版红色带OBD转接头的&#xff1a; 所有下图是我选择…

Qt可视化大屏布局

科技大屏现在非常流行&#xff0c;这里分享一下某个项目的大屏布局&#xff08;忘了源码是哪个博主的了&#xff09; 展示 这个界面整体是垂直布局&#xff0c;分为两个部分&#xff0c;标题是一个部分&#xff0c;然后下面的整体是一个layout布局&#xff0c;为另外一部分。 l…

PE文件结构 安全分析与恶意软件研究 逆向工程 优化与性能调整 兼容性与移植性分析

了解PE&#xff08;Portable Executable&#xff0c;可移植可执行文件&#xff09;文件结构有多个用途 对于软件开发、安全分析、逆向工程等领域的专业人士来说尤其重要。PE文件格式是Windows操作系统中用于可执行文件、动态链接库&#xff08;DLLs&#xff09;、以及其他文件…

随身wifi刷机

工具密码&#xff1a;f5ft 刷机包 MiKo备份&#xff08;有BIN包的不用&#xff0c;没有bin的去下载就砖包&#xff09; 需要进9008模式&#xff0c;用牙签插着孔里的按钮查如电脑usb接口&#xff0c;看到 出现端口&#xff0c;有个9008的就算成功进入&#xff0c;安装替换mik…

0基础学习VR全景平台篇第141篇:如何制作卫星航拍全景

大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 很多人都看过或者拍摄过航拍全景&#xff0c;其效果相比于普通的地拍的确有着更加震撼的拍摄效果&#xff0c;但是受限于无人机高度&#xff0c;以及禁飞区等等限制&#xff0c;导致很多大场景无法展示完全&a…

Docker 搭建mysql 集群(二)

PXC方案 很明显 PXC方案在任何一个节点写入的数据都会同步到其他节点&#xff0c;数据双向同步的&#xff08;在任何节点上都可以同时读写&#xff09; 创建MySQL PXC集群 1 安装PXC镜像 docker pull percona/percona-xtradb-cluster:5.7.21 2 为PXC镜像改名 docker tag pe…

【240121】桂林电子科技大学—调剂信息

桂林电子科技大学 学校层级&#xff1a;双非 调剂专业&#xff1a;081000 信息与通信工程 发布时间&#xff1a;2024.1.21 发布来源&#xff1a;网络发布 背景&#xff1a;欢迎广大08工学专业考生调剂进我的课题组&#xff0c;电子信息专业&#xff0c;也欢迎往届同学调剂…

哪些行业能考PMP?给个人带来什么价值?

目前项目管理的已在国际航天、电子、通讯、计算机、软件开发、建筑、制药、金融等行业甚至政府机关内广泛应用。 一、PMP学员细分&行业应用 在充分竞争的市场环境下&#xff0c;企业之间的竞争&#xff0c;就是项目管理成熟度之间的竞争&#xff0c;越来越多的企业认识到…

如何用VS2022打包exe

1.添加打包工具。 VS2022中选择 扩展->管理扩展&#xff0c;输入 Setup&#xff0c;选择 Microsoft Vusual Studio Installer Porjiects 2022。 2.在项目选择 “添加新的项目”&#xff0c;选择 Setup Project 3.生成Setup工程。 4.添加为打包项目添加文件和文件夹(如果打…