每日一题——在二叉树中找到两个节点的最近公共祖先
创作时间:
作者:
@小白创作中心
每日一题——在二叉树中找到两个节点的最近公共祖先
引用
CSDN
1.
https://m.blog.csdn.net/zxjiaya/article/details/145399481
在二叉树中寻找两个节点的最近公共祖先是一个经典的算法问题。本文将从题目描述、解题思路到代码实现,详细讲解如何解决这个问题。
题目描述
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
数据范围
- 树上节点数满足 $1 \leq n \leq 10^5$。
- 节点值
val满足区间[0, n)。 - 本题保证二叉树中每个节点的
val值均不相同。
输入输出
输入:
- 输入树的节点,格式为一个数组表示二叉树的层序遍历,
#表示空节点。 - 输入两个整数
o1和o2,表示需要查找最近公共祖先的两个节点的值。
输出:
- 输出节点值,即
o1和o2的最近公共祖先的值。
示例
示例 1:
输入:
{3,5,1,6,2,0,8,#,#,7,4}, 5, 1
输出:
3
示例 2:
输入:
{3,5,1,6,2,0,8,#,#,7,4}, 2, 7
输出:
2
解题思路
要解决这个问题,我们可以使用递归的方法遍历二叉树。具体的思路如下:
- 递归终止条件:
- 如果当前节点为空,返回
NULL(表示未找到o1和o2)。 - 如果当前节点的值是
o1或o2,说明找到了其中一个节点,返回当前节点。
- 递归查找左子树和右子树:
- 分别在左子树和右子树中查找
o1和o2。 - 如果左子树找到一个节点,右子树也找到一个节点,说明当前节点是最近公共祖先,返回当前节点的值。
- 如果只有左子树或右子树找到节点,则递归返回找到的节点。
- 时间复杂度:
- 每个节点最多遍历一次,因此时间复杂度为 $O(n)$,其中 $n$ 为二叉树的节点数。
C代码实现
// 定义二叉树节点结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
// 查找最近公共祖先的函数
int lowestCommonAncestor(struct TreeNode* root, int o1, int o2) {
if (root == NULL) {
return -1; // 如果当前节点为空,返回-1
}
// 如果当前节点是o1或o2,返回当前节点
if (root->val == o1 || root->val == o2) {
return root->val;
}
// 在左子树和右子树中递归查找o1和o2
int left = lowestCommonAncestor(root->left, o1, o2);
int right = lowestCommonAncestor(root->right, o1, o2);
// 如果在左子树和右子树中分别找到了o1和o2,当前节点就是最近公共祖先
if (left != -1 && right != -1) {
return root->val;
}
// 如果只在左子树或右子树中找到o1或o2,返回找到的那个节点
return (left != -1) ? left : right;
}
代码解释
- 节点定义:
- 我们首先定义了二叉树的节点结构体
TreeNode,它包含了三个成员: val:节点的值。left:指向左子树的指针。right:指向右子树的指针。
- 递归函数:
lowestCommonAncestor函数通过递归查找左右子树,判断每个子树中是否包含o1和o2,并最终找到最近公共祖先。- 基本的递归步骤是:
- 如果当前节点为空,返回
-1。 - 如果当前节点的值是
o1或o2,则返回该节点的值。 - 否则递归查找左子树和右子树,合并结果。
- 最终返回值:
- 如果左子树和右子树都找到了目标节点,则当前节点是最近公共祖先,返回当前节点的值。
- 如果只有左子树或右子树找到了目标节点,则返回找到的那个子树的值。
总结
最开始还觉得这题确实挺难的,但是其实只要仔细思考这题,难度其实也并不大。一层一层的递归找到。这个根节点。然后再一层层的返回。返回的节点,肯定都是他的祖宗结点。当满足左子树。和右子树各有一个时候,就可以返回当前结点。如果都在一侧,说明当前节点就是最近祖先节点。通过递归的方式,我们可以高效地解决二叉树中两个节点的最近公共祖先问题。该方法的时间复杂度为 $O(n)$,空间复杂度为 $O(h)$,其中 $h$ 是二叉树的高度。
热门推荐
烤瓷牙的材料哪种选择优?如何判断烤瓷牙材料的好坏?
深度学习代码如何复现
上市车企10月销量透视:比亚迪、赛力斯、吉利汽车增速居前
如何做新疆旅游项目经理
保单上如何查找税优识别码——以保单右上角为重点
农村房产证办理流程及费用明细
金线莲真面目:草药界的“低调贵族”
租金的构成因素是什么?这些因素如何影响租金水平?
心脏血管病变的“探照灯”——冠状动脉CTA检查
广东肠粉热量揭秘:美味与热量的平衡之道
夏天运动出汗太多怎么办?医生给出五大实用建议
如何优化石灰窑的煅烧工艺来降低生过烧率
餐饮新标杆:高效节能商用消毒柜选购全攻略
怀孕期间,应避免食用哪些菌类?
二手车交易费用解析:了解费用结构,轻松选购二手车
物理和化学性质:详解没食子酸的卓越特性
世间纷纷扰扰在复杂的世界里,做一个简单的人
卡西尼号探测器:揭秘土星系统的奥秘
厨房五金包括什么?厨房五金选购全攻略
Dynamic Textbox Color
个税汇算,为啥有人退税、有人补税?一下说清楚!
高中生心理健康标准
吃醋的八大好处与注意事项:如何正确食用醋以促进健康
Excel表格插入与使用完全指南
如何通过优化网站内容提升用户满意度与搜索引擎排名?
心安神、健脾益气,薏米茯苓茶的全面功效与保健作用
济宁十大旅游景点推荐:从曲阜明故城到微山湖
泰国留学货币指南:泰铢兑换、银行卡使用全攻略
婚姻择偶观:传统与现代的差异及其影响
零售行业提升利润的成本控制措施