《程序员面试金典(第6版)》面试题 04.08. 首个共同祖先
创始人
2025-05-28 12:35:27

题目描述

设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

    3/ \5   1/ \ / \
6  2 0  8/ \7   4

示例 1:

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

示例 2:

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

说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。

解题思路与代码

对于写递归函数而言,要分别搞清楚三件事,分别是:

  1. 递归函数的返回类型与形参是什么?
  2. 递归函数该如何结束/返回?
  3. 单层递归的逻辑是什么?

递归查找公共祖先节点

这道题我认为是一道十分注重细节的递归题。为什么这么说呢,这是因为有很多条件,你少写了或者位置写错了,那么这一道题,就很有可能误入歧途,写错了。

那请大家跟着我的思路走一遍,我是这么思考这道题的。
这道题,我简答的思考了一下,我就打算在原函数上进行递归,因为我发现我并不需要传递多余参数,且返回值是TreeNode*类型,刚刚好,所以就在原函数上进行递归了。

然后就可以开始去思考递归的终止条件是什么了。那么首先,如果root节点若为空,那肯定就得返回null。其次,如果root节点等于p或q节点,那就直接返回root。在不然,就去判断root->left,与root->right。

这里着重要去注意: 我们要用 一个新的节点去递归root->left、root->right,而不是直接让 root->left去递归它本身。用代码表示就是要这样写:

TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right = lowestCommonAncestor(root->right,p,q);

而不是这样写:

root->left = lowestCommonAncestor(root->left,p,q);
root->right = lowestCommonAncestor(root->right,p,q);

这里是这个代码的第一个易错点

紧接着,我们要开始另一部分的结束判断了。这里还有一个易错点,这里的代码要这样写:

if(left && right) return root;
else if(left && !right) return left;
else if(!left && right) return right;return nullptr;

而不是这样写:

if(left && !right) return left
else if(right && !left) return right;
else return rootreturn nullptr;

我们要记住,这里其实是一个有四种情况的,一种是left为空,right不为空,一种是left不为空,right为空,一种是都不为空,一种是都为空。

少写一种判断,就都写错了。

这道题就这两个最容易错的点。如果都写对了,那这道题就对了。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root == nullptr) return nullptr;if(root == p || root == q) return root;TreeNode* left = lowestCommonAncestor(root->left,p,q);TreeNode* right = lowestCommonAncestor(root->right,p,q);if(left && right) return root;else if(left && !right) return left;else if(!left && right) return right;return nullptr;}
};

在这里插入图片描述

复杂度分析:

时间复杂度:O(N),其中 N 为二叉树中的节点数。对于每个节点最多会访问一次,所以时间复杂度为 O(N)。

空间复杂度:O(h),其中 h 表示二叉树的高度。

总结

这道题不算太难的题,但也有些难度。在我的理解上,这道题有两个易错点。一不留神就会写错,一定得多多注意!

相关内容

热门资讯

HTTPS 之fiddler抓... Jmeter接口测试和接口自动化测试从入门到精通,全套项目实战!...
Vmware Ubuntu虚拟... 一、背景 先来说一下我的需求背景,我是在VMware中安装的Ubuntu虚拟机...
友谊的小船说翻就翻是什么意思 ... 友谊的小船说翻就翻是什么意思 目录友谊的小船说翻就翻是什么意思 网络语友谊的小船说翻就翻出自哪里,是...
爱迪奥特曼大结局,关于EVA大... 爱迪奥特曼大结局目录爱迪奥特曼大结局关于EVA大结局eva的大结局是什么?迪迦奥特曼 的结局是什么?...
废青是什么意思 ,自称自己是“... 废青是什么意思 目录00后到底是怎样一代人?自称自己是“废柴”,“废柴”啥意思董遇的三余是什么意思 ...
关于蛇的电影 极速百科网 极速... 关于蛇的电影目录关于蛇的电影关于蛇的电影有关蛇的电影有哪些?关于蛇的电影关于蛇的电影说到关于蛇的电影...
智能自动搬运设备四向穿梭车AG... 四向穿梭车现已成为穿梭车货架系统中的重要核心,作为高新科技先进的自动化物料搬运设备&#...
大数据分析工具Power BI... 导入数据操作介绍进入PowBI,弹出的如下页面也可以直接关闭,在Powe...
不是所有电脑换了固态硬盘=秒开...        即使是做简单的拷贝,其速度可能还不如机械硬盘。而3A游戏大作的文件体积也...
一笑倾人城再笑倾人国出自 ,“... 一笑倾人城再笑倾人国出自 目录一笑倾人城再笑倾人国出自 “一笑倾人城,再笑倾人国。”出自……?一笑倾...
小爸爸插曲是什么,《小爸爸》的... 小爸爸插曲是什么目录小爸爸插曲是什么《小爸爸》的插曲是什么名字小爸爸里面的插曲《小爸爸》里面的所有插...
斗罗大陆大师的结局,斗罗大陆3... 斗罗大陆大师的结局目录斗罗大陆大师的结局斗罗大陆3最后大师和谁结婚了史莱克七怪成神后大师去哪了斗罗大...
TextView用Spanna... textContent.getViewTreeObserver().addOnPreDrawList...
GIS(地理信息系统/地理信息... 目录1.前言2.中科院3.人社部3.1 初级、中级3.2 高级、正高级3.3 公示时间4. 证书5....
C#实现对IIS网站和应用程序... 一、需求分析 在我们的日常运维中,可能会遇到业务网站在运行一段时间后由于某些不确定因...
草原之夜原唱是谁 ,歌曲草原之... 草原之夜原唱是谁 目录草原之夜原唱是谁 歌曲草原之夜原唱草原之夜原唱是谁草原之夜原唱草原之夜原唱是谁...
87版射雕英雄传演员表 ,87... 87版射雕英雄传演员表 目录87版射雕英雄传演员表 87版射雕英雄传演员表射雕英雄传电视剧演员电影1...
吃棒棒糖是什么意思 ,光棍节为... 吃棒棒糖是什么意思 目录吃棒棒糖是什么意思 光棍节为什么吃棒棒糖吃粉色棒棒糖的含义吃棒棒糖是什么意思...
蓝鱼还叫什么鱼 ,蓝蓝的什么鱼... 蓝鱼还叫什么鱼 目录蓝鱼还叫什么鱼 蓝蓝的什么鱼nemo fish是什么种类的鱼有谁知道这是什么鱼蓝...
漫画:什么是归并排序算法? 归并排序是建立在归并操作的一种高效的排序方法,该方法采用了分治的思想,比...
目标检测,实例分割IOU,pr... 经常在目标检测,分割的paper中看到mAP这样的评价标准, 那么mAP...
Qt5.12实战之QByteA... 示例源码:#include #include #include static QTextStream...
ros_control教程 在本教程中,我们将设置模拟控制器来驱动机器人的关节。这将使我们能够为像MoveIt!这样的规划者提供...
沈佳宜是谁 ,沈佳宜是谁扮演的... 沈佳宜是谁 目录沈佳宜是谁 沈佳宜是谁扮演的沈佳宜到底是谁???沈佳宜是谁呢?沈佳宜是谁 沈佳宜是一...
经典短篇爱情小说,有没有什么好... 经典短篇爱情小说目录经典短篇爱情小说有没有什么好看的短篇爱情小说找几篇短篇爱情小说。经典短篇爱情小说...
鸵鸟是不是鸟类 ,鸵鸟是不是鸟... 鸵鸟是不是鸟类 目录鸵鸟是不是鸟类 鸵鸟是不是鸟类 鸵鸟介绍鸵鸟属于鸟吗鸵鸟是鸟类吗鸵鸟是不是鸟类 ...
前端HTML5+CSS3(女神... 前端HTML5+CSS3(女神版)——day04——选择器进阶、...
什么游戏蓝牙耳机好用?性价比高... 现如今,蓝牙耳机越来越成为人们日常生活中必不可少的数码单品,最近看到很多...
防火墙实验(实现trust、u... 先在Cloud上创建端口如下图: 然后双机打开防火墙 注:用户密码可以...
在我眼前却又消失不见是什么歌 ... 在我眼前却又消失不见是什么歌 目录在我眼前却又消失不见是什么歌 在我眼前,却又消失不见是什么歌曲歌词...