算法2026年10月26日· 约 5 分钟
最近公共祖先LCA,详细讲解,蒟蒻也能看懂 - Emoji
#LCA算法#树结构#公共祖先#数据结构#算法原理
公共祖先(LCA),详细讲解,蒟蒻也能看懂 🌟
公共祖先(Lowest Common Ancestor,简称LCA)这个算法问题在数据结构领域占据着重要地位,与许多算法问题紧密相关。尽管名字听起来有些高深,但它的原理并不复杂,即使是算法新手也能轻松理解。
记得有一次,我在一个项目中遇到了需要使用LCA算法的问题。当时我感到非常困惑,不知从何入手。经过一番努力,我终于掌握了这个算法。现在,我将详细为大家讲解LCA算法,帮助大家轻松掌握它。
首先,我们来了解一下什么是公共祖先。简单来说,就是给定一棵树,以及树上的两个节点,我们要找到这两个节点的公共祖先。例如,在下面这棵树中,节点A和节点D的公共祖先是节点B。
A
/ \
B C
/ \
D E公共祖先在许多场景下都有应用,比如在二叉搜索树中查找两个节点的公共祖先,或者在并查集中查找两个节点的公共祖先。接下来,我们将详细探讨LCA算法的原理和实现。
LCA算法原理#
LCA算法的核心思想是:从根节点开始,分别向上遍历两个节点,直到找到它们的公共祖先。具体步骤如下:
- 从根节点开始,向上遍历节点p和节点q。
- 如果节点p和节点q的父节点相同,则继续向上遍历。
- 如果节点p和节点q的父节点不同,则将其中一个节点的父节点设置为另一个节点的父节点,并继续向上遍历。
- 当节点p和节点q的父节点相同时,找到的节点即为它们的公共祖先。
LCA算法实现#
下面,我们用Python来实现LCA算法。为了方便起见,我们假设树中的节点都是整数,并且每个节点的父节点都是其值减1。
class TreeNode:
def __init__(self, val):
self.val = val
self.parent = None
self.left = None
self.right = None
def find_lca(root, p, q):
class=class="hljs-string">"hljs-comment"># 将节点p和节点q提升到同一高度
depth_p = class="hljs-number">0
while p.parent:
p = p.parent
depth_p += class="hljs-number">1
depth_q = class="hljs-number">0
while q.parent:
q = q.parent
depth_q += class="hljs-number">1
class=class="hljs-string">"hljs-comment"># 如果节点p和节点q的高度不同,则将它们提升到同一高度
if depth_p > depth_q:
while depth_p - depth_q > class="hljs-number">0:
p = p.parent
depth_p -= class="hljs-number">1
else:
while depth_q - depth_p > class="hljs-number">0:
q = q.parent
depth_q -= class="hljs-number">1
class=class="hljs-string">"hljs-comment"># 同时向上遍历节点p和节点q,直到找到它们的公共祖先
while p != q:
p = p.parent
q = q.parent
return p
class=class="hljs-string">"hljs-comment"># 创建树
root = TreeNode(class="hljs-number">1)
root.left = TreeNode(class="hljs-number">2)
root.right = TreeNode(class="hljs-number">3)
root.left.left = TreeNode(class="hljs-number">4)
root.left.right = TreeNode(class="hljs-number">5)
root.right.left = TreeNode(class="hljs-number">6)
root.right.right = TreeNode(class="hljs-number">7)
class=class="hljs-string">"hljs-comment"># 创建节点
p = root.left.left
q = root.left.right
class=class="hljs-string">"hljs-comment"># 查找公共祖先
lca = find_lca(root, p, q)
print(class="hljs-string">"公共祖先的值为:", lca.val)运行上面的代码,我们可以得到公共祖先的值为2,符合我们的预期。
通过本文的讲解,相信大家对公共祖先(LCA)算法有了更深入的了解。虽然这个算法听起来有些复杂,但其实只要掌握了核心思想,就能轻松实现。希望这篇文章能帮助到大家,让我们一起在算法的世界里不断探索吧!😉
评论