手撕算法:二叉搜索树的最近公共祖先
创作时间:
作者:
@小白创作中心
手撕算法:二叉搜索树的最近公共祖先
引用
CSDN
1.
https://m.blog.csdn.net/weixin_43155866/article/details/136892630
二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何节点的值,且小于其右子树中的任何节点的值。这种性质使得二叉搜索树在查找、插入和删除操作中具有较高的效率。
在二叉搜索树中,最近公共祖先(Lowest Common Ancestor,LCA)是指两个节点在树中最近的公共祖先节点。例如,在下图中,节点4和7的最近公共祖先是6。
算法思路
由于二叉搜索树中没有相同值的节点,我们可以利用二叉搜索树的性质来寻找目标节点。具体步骤如下:
- 从根节点开始,根据目标值与当前节点值的大小关系,递归地在左子树或右子树中查找目标节点。
- 在查找过程中,记录从根节点到目标节点的路径。
- 比较两个目标节点的路径,找到第一个不同的节点,该节点的前一个节点即为最近公共祖先。
代码实现
以下是使用Java实现的代码:
public class Solution {
public int lowestCommonAncestor(TreeNode root, int p, int q) {
// 求根节点到两个节点的路径
ArrayList<Integer> path_p = getPath(root, p);
ArrayList<Integer> path_q = getPath(root, q);
int res = 0;
// 比较两个路径,找到第一个不同的点
for (int i = 0; i < path_p.size() && i < path_q.size(); i++) {
int x = path_p.get(i);
int y = path_q.get(i);
// 最后一个相同的节点就是最近公共祖先
if (x == y)
res = path_p.get(i);
else
break;
}
return res;
}
// 求得根节点到目标节点的路径
public ArrayList<Integer> getPath(TreeNode root, int target) {
ArrayList<Integer> path = new ArrayList<Integer>();
TreeNode node = root;
// 节点值都不同,可以直接用值比较
while (node.val != target) {
path.add(node.val);
// 小的在左子树
if (target < node.val)
node = node.left;
// 大的在右子树
else
node = node.right;
}
path.add(node.val);
return path;
}
}
热门推荐
紫砂壶:中国传统茶文化的璀璨明珠
新生儿夜哭,咋办!揭秘10种原因及处理方法
Windows 11 如何跳过联网激活?跳过后如何重新激活?
盐酸氨基葡萄糖片有什么作用
跑步新手指南:如何科学安排跑步频率?
上班一族的瑜伽练习
美术学类文化分须达一批次线上30分!清华大学美术学院2025年校考六大变化解读
戴家心意拳内功-猩猩出洞
上海迪士尼频上热搜,这类事件没人管管吗?
斯特拉斯堡与欧塞尔的对决:历史交锋与近期状态的深度分析
欧洲国家医疗福利对比,哪个国家医疗更强
意式咖啡与美式咖啡,有什么区别?看完涨知识了!建议收藏
做梦梦见父母亲是什么意思
老年人,需要额外吃营养素补充剂吗?
植物生长调节剂的分类,分为以下6大类
高精度计时数据确定光子质量的上限
公务员体检血糖标准全解析:5.62是否需要复检?
通化到海南自驾攻略:3510公里的全程详解
2025汽车出游保养指南:行前必检项目、五油三水、轮胎胎压全攻略
数字化如何帮乡村教师改进教学
长期吸烟的人,若晨起后出现4个症状,或说明肺已经“伤痕累累”
如何做到情绪稳定或情绪自律
科普|儿童家庭用药指导之儿童呼吸道感染使用解热镇痛药(退热药)
面对突发压力事件的四个处理步骤
2025年养老金在线模拟计算器:退休工资一目了然,优化搜索体验
改善不受控制的情绪——识别情绪背后的自动思维
检查尿常规之前可以喝水吗
热水器除垢方法详解,保持水质清洁
个人所得税清缴汇算的操作指南与法律风险防控
【身边税事】个人所得税扣缴端如何进行数据备份和恢复?