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

文章目录

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

题目

标题和出处

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

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

难度

5 级

题目描述

要求

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

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

示例

示例 1:

示例 1

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

示例 2:

示例 2

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

示例 3:

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

数据范围

  • 树中结点数目在范围 [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 的公共祖先,其中深度最大的公共祖先即为最近公共祖先。

考虑示例 1 和示例 2 使用的二叉树。

图 1

示例 1 中, p = 5 p = 5 p=5 q = 1 q = 1 q=1。结点 5 5 5 对应的路径是 [ 3 , 5 ] [3, 5] [3,5],结点 1 1 1 对应的路径是 [ 3 , 1 ] [3, 1] [3,1],唯一的公共祖先是 3 3 3,最近公共祖先是 3 3 3

示例 2 中, p = 5 p = 5 p=5 q = 4 q = 4 q=4。结点 5 5 5 对应的路径是 [ 3 , 5 ] [3, 5] [3,5],结点 4 4 4 对应的路径是 [ 3 , 5 , 2 , 4 ] [3, 5, 2, 4] [3,5,2,4],公共祖先是 3 3 3 5 5 5,最近公共祖先是 5 5 5

当遍历到一个结点时,即可得到从根结点到该结点的路径,将路径反转之后即可得到从该结点到根结点的路径。对于结点 p p p q q q 分别得到从当前结点到根结点的路径,两条路径相交处的结点即为最近公共祖先。

为了得到反向路径,需要使用哈希表存储每个结点的父结点。对二叉树深度优先搜索,在遍历过程中将每个结点的父结点存入哈希表。遍历结束之后,从结点 p p p 出发,每次移动到当前结点的父结点,直到到达根结点时,即得到从结点 p p p 到根结点的路径。在寻找从结点 p p p 到根结点的路径的过程中,使用哈希集合存储访问过的结点。然后从结点 q q q 出发,每次移动到当前结点的父结点,寻找从结点 q q q 到根结点的路径,第一个遇到的在哈希集合中的结点即为最近公共祖先。

代码

class Solution {Map<TreeNode, TreeNode> parentMap = new HashMap<TreeNode, TreeNode>();Set<TreeNode> visited = new HashSet<TreeNode>();public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {dfs(root);TreeNode node = p;while (node != null) {visited.add(node);node = parentMap.get(node);}TreeNode ancestor = q;while (!visited.contains(ancestor)) {ancestor = parentMap.get(ancestor);}return ancestor;}public void dfs(TreeNode node) {TreeNode left = node.left, right = node.right;if (left != null) {parentMap.put(left, node);dfs(left);}if (right != null) {parentMap.put(right, node);dfs(right);}}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。深度优先搜索访问每个结点一次,需要 O ( n ) O(n) O(n) 的时间,对于结点 p p p 和结点 q q q,寻找从当前结点到根结点的路径的时间不超过 O ( n ) O(n) O(n),因此总时间复杂度是 O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是哈希表、哈希集合和栈的空间,哈希表需要 O ( n ) O(n) O(n) 的空间存储每个结点的父结点,哈希集合和栈的空间取决于二叉树的高度,二叉树的高度不超过 O ( n ) O(n) O(n),因此总空间复杂度是 O ( n ) O(n) O(n)

解法二

思路和算法

考虑二叉树中的每个结点,可能有以下情况。

  1. 如果 p p p q q q 中的一个结点是当前结点,另一个结点在以当前结点为根结点的子树中,则当前结点即为 p p p q q q 的最近公共祖先。

  2. 如果 p p p q q q 分别位于当前结点的左子树和右子树中,则当前结点即为 p p p q q q 的最近公共祖先。

  3. 如果 p p p q q q 位于当前结点的同一个子树中,则 p p p q q q 的最近公共祖先位于当前结点的同一个子树中。

上述情况中的情况 1 和情况 2 为当前结点是 p p p q q q 的最近公共祖先,对于情况 3,需要在子树中继续寻找 p p p q q q 的最近公共祖先,最近公共祖先一定满足情况 1 或情况 2。因此,最近公共祖先可能的情况一共有两种。

为了寻找最近公共祖先,需要从根结点开始深度优先搜索。对于每个结点,在当前子树中寻找 p p p q q q 是否存在,如果 p p p q q q 都存在则返回最近公共祖先,如果 p p p q q q 只存在一个则返回存在的结点。以下将 p p p q q q 统称为「目标结点」。

具体做法如下。

  1. 如果当前结点为 p p p q q q,则返回当前结点。

  2. 否则,在当前结点的左子树和右子树中分别寻找 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) {if (root == p || root == q) {return root;}TreeNode leftAncestor = null, rightAncestor = null;if (root.left != null) {leftAncestor = lowestCommonAncestor(root.left, p, q);}if (root.right != null) {rightAncestor = lowestCommonAncestor(root.right, p, q);}if (leftAncestor != null && rightAncestor != null) {return root;}return leftAncestor != null ? leftAncestor : rightAncestor;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

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

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

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

相关文章

我买了个AI员工,凌晨5点喊我起床,搞了篇全网40万+的爆款

大家好我是二狗&#xff0c;是夕小瑶科技说编辑部的一名作者。 前天早上凌晨5点左右的时候&#xff0c;我被尿憋醒了&#xff0c;起来上了个厕所。 就在我准备躺下接着睡的时候&#xff0c;顺手看了一眼手机。 咦?屏幕上弹出了一条邮件&#x1f4ee;推送&#xff0c;是我们编…

小鸟飞呀飞

欢迎来到程序小院 小鸟飞呀飞 玩法&#xff1a;鼠标控制小鸟飞翔的方向&#xff0c;点击鼠标左键上升&#xff0c;不要让小鸟掉落&#xff0c;从管道中经过&#xff0c;快去飞呀飞哦^^。开始游戏https://www.ormcc.com/play/gameStart/204 html <canvas width"288&quo…

红海营销时代,内容占位的出海品牌更有机会营销占位

#01 品牌出海&#xff1a;内容占位就是品牌营销占位 红海营销时代&#xff0c;内容信息充斥着用户周边。无论线上还是线下&#xff0c;生活工作、休闲娱乐等不同场景内&#xff0c;广告信息均无孔不入。对于用户来说&#xff0c;能记住的品牌或者商品往往寥寥无几。 占位营销…

水声功率放大器在声呐系统中的应用有哪些

水声功率放大器在声呐系统中扮演着重要的角色&#xff0c;其应用涵盖了声呐系统的多个方面。下面就让安泰电子来介绍水声功率放大器在声呐系统中的应用。 发射声波信号&#xff1a;声呐系统通过发射声波信号并接收其回波来探测和测量海洋中的目标物体。水声功率放大器用于放大发…

WhatsApp新营销全解:如何才能真正留住你的客户

WhatsApp营销这件事上&#xff0c;从获取线索、留存客户、成交转化到复购推荐的整个流程中&#xff0c;方方面面的因素影响着最终的转化效果。今天开始&#xff0c;我们会在公众号内新增WhatsApp新营销全解系列&#xff0c;结合前人踩过的坑和成功经验&#xff0c;来为大家说说…

2023第十七届中国品牌节 | 每日互动刘宇分享大模型创新应用AITA智选人群工具

11月18日-20日&#xff0c;2023第十七届中国品牌节在杭州市云栖小镇国际会展中心盛大举行。本次活动以“复苏与腾飞”为主题&#xff0c;来自政、商、产、学、媒等各界嘉宾6000余位济济一堂&#xff0c;共同见证民族品牌的崛起&#xff0c;携手奉献一场史无前例的“品牌人的亚运…

镭速,克服UDP传输缺点的百倍提速传输软件工具

在网络传输中&#xff0c;我们经常会面临这样的困难&#xff1a;文件太大&#xff0c;传输速度太慢&#xff0c;浪费时间和流量&#xff1b;文件太小&#xff0c;传输速度太快&#xff0c;容易出现丢包和乱序&#xff0c;损害数据的完整性和正确性。这些困难的根本在于传输层协…

投资黄金:如何选择正确的黄金品种增加收益?

黄金一直以来都是备受投资者青睐的避险资产&#xff0c;然而&#xff0c;在庞大的黄金市场中&#xff0c;选择适合自己的黄金品种成为影响收益的关键因素。黄金投资并不只有一种方式&#xff0c;而是有很多种不同的黄金品种可以选择。每种黄金品种都有其独特的特点和风险&#…

腾讯待办停止运营,怎么继续提醒事情呢?

由于业务方向调整&#xff0c;腾讯待办小程序宣布于2023年的12月20日全面停止运营并下架&#xff0c;这就表示在此之后&#xff0c;腾讯待办这款待办小程序就无法继续使用了。如果你之前在这款待办工具中记录待办事项、设置提醒时间&#xff0c;建议及时导出待办数据&#xff0…

论文阅读:“基于快速特征点提取和描述算法与色调、饱和度和明度的图像特征点匹配算法”

文章目录 摘要引言方法实验结果图像预处理结果对比图像配准结果对比 参考文献 摘要 提出了一种基于快速点特征提取和描述&#xff08;ORB&#xff09;算法与色调、饱和度和明度&#xff08;HSV&#xff09;的图像特征点匹配算法。首先利用双边滤波和均值滤波结合对图像进行预处…

FPC焊点剥离失效分析

一、案例背景 FPC在后续组装过程中&#xff0c;连接器发生脱落。在对同批次的样品进行推力测试后&#xff0c;发现连接器推力有偏小的现象。据此进行失效分析&#xff0c;明确FPC连接器脱落原因。 #1、#2样品连接器脱落连接器脱落&#xff1b;#3样品连接器未脱落&#xff1b;…

大数据-之LibrA数据库系统告警处理(ALM-12057 元数据未配置周期备份到第三方服务器的任务)

告警解释 系统安装完成后会检查元数据是否有周期备份到第三方服务器的任务&#xff0c;然后每1小时会检查一次。如果元数据未配置周期备份到第三方服务器的任务&#xff0c;将发送严重告警。 在用户创建元数据周期备份到第三方服务器的任务后&#xff0c;告警消除。 告警属性…