手撕算法:二叉搜索树的最近公共祖先
创作时间:
作者:
@小白创作中心
手撕算法:二叉搜索树的最近公共祖先
引用
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;
}
}
热门推荐
找到工作了,如何办理退出灵活就业登记参保?
为何多数女明星宁愿选剖腹产留疤,也不愿意顺产?医生道出了原因
剖腹产 vs 顺产:明星的选择背后
噪音扰民标准时间
深观察丨“加征关税产生的成本都将被转嫁给美国人”
如何分析日本动漫《阿松》中的松野一松的性格特点?
中国冥币在国外掀起狂潮?老外直言:有这好东西,为何不早说?
MPC-BE 1.8.2发布:优化解码、提升视频转换效率等
深度思考,就是把握事物本质或底层逻辑的能力
手机系统文件删除指南:安全操作释放存储空间
仲裁与诉讼:民商事纠纷解决方式的管辖权对比
王者荣耀全皮肤账号价值几何-深入解析皮肤数量与价格影响
血糖高的人可以吃玉米糊吗?这些注意事项要记牢
血糖高的人可以适量食用玉米糊,这些注意事项需谨记
宝山区既有多层住宅加装电梯流程指南
春节出行,不止路上的风景......与汽车电影和汽车游戏同行
家教兼职在哪里找?这份全面指南请收好
学生党也能赚钱,五个适合学生的在线兼职推荐
为什么冬季更容易发生心肌梗死?
健忘症怎么检查
如何矫正导致的重影问题?
热水器调温度怎么调
深度解析:专科警校有必要上吗?入警难度大吗?毕业后是辅警?
番茄的种植季节与方法详解
那个原子弹爆炸后,背“亡弟”去火葬场的日本小男孩,后来怎样了
回顾:原子弹爆炸半衰期动辄万年起步,为何广岛长崎现在就居住了?
大连到大理自驾更佳路线攻略:沿途美景与实用建议
医生解答:哪些药物可以预防肠粘连?
恋爱脑是什么原因
“赵氏孤儿”的历史真相是什么?《史记》中记载的真正的“赵氏孤儿”