图解LeetCode——剑指 Offer 68 - II. 二叉树的最近公共祖先

简介: 图解LeetCode

一、题目

  • 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先
  • 百度百科中最近公共祖先的定义为:

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

二、示例

2.1> 示例 1:

【输入】 root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

【输出】 3

【解释】 节点 5 和节点 1 的最近公共祖先是节点 3。

2.2> 示例 2:

【输入】 root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

【输出】 5

【解释】 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的
  • pq 为不同节点且均存在于给定的二叉树中。

三、解题思路

  • 根据题目描述,会给我们两个节点,分别是TreeNode pTreeNode q,然后我们需要在一个二叉树中去寻找着两个给定节点的最近公共祖先。这个题与《剑指 Offer 68 - I. 二叉搜索树的最近公共祖先》很类似,只不过我们这个树是普通的二叉树,不能利用二叉搜索树的特性来解题了。
  • 那么我们知道,针对某一个节点来说,它是具有左子树右子树这两个属性的,那么对于随机给出的p节点q节点来说,就会有如下3种情况,请见下图所示:

  • 根据上图描述,我们可以得出如下3种情况:

情况1】当p节点q节点分别在根节点的左子树和右子树中时,那么根节点就是最近公共祖先节点。

情况2】当p节点q节点都在根节点的左子树中时,第一个遍历到的节点就是最近公共祖先节点。

情况3】当p节点q节点都在根节点的右子树中时,第一个遍历到的节点就是最近公共祖先节点。

  • 所以,针对上面的分析,我们可以通过深度遍历来遍历二叉树中的节点,当发现某个节点等于p节点或者等于q节点,则终止这一侧子树的遍历。然后当根节点的左子树和右子树都遍历完毕后,再根据以上3种情况,返回这道题的最终结果即可。
  • 解题思路我们说完了,下面还是按照惯例,以输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 8为例,看一下具体处理流程是怎么样子的。请见下图所示:

四、代码实现

classSolution {
publicTreeNodelowestCommonAncestor(TreeNoderoot, TreeNodep, TreeNodeq) {
if (root==null||root==p||root==q) returnnull;
TreeNodeln=lowestCommonAncestor(root.left, p, q);
TreeNodern=lowestCommonAncestor(root.right, p, q);
return (ln!=null&&rn!=null) ?root : (ln!=null?ln : rn);
    }
}


今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

相关文章
|
1月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
20 2
|
1月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
16 2
|
1月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
16 2
|
1月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
20 0
|
1月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
15 0
|
1月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
17 0
|
1月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
17 0
|
1月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
16 0
|
3月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
3月前
|
算法 Java
LeetCode第94题二叉树的中序遍历
文章介绍了LeetCode第94题"二叉树的中序遍历"的解法,使用递归实现了中序遍历的过程,遵循了"左根右"的遍历顺序,并提供了清晰的Java代码实现。
LeetCode第94题二叉树的中序遍历