算法2026年10月26日· 约 5 分钟

最近公共祖先LCA,详细讲解,蒟蒻也能看懂 - Emoji

#LCA算法#树结构#公共祖先#数据结构#算法原理
Twitter 微博

公共祖先(LCA),详细讲解,蒟蒻也能看懂 🌟

公共祖先(Lowest Common Ancestor,简称LCA)这个算法问题在数据结构领域占据着重要地位,与许多算法问题紧密相关。尽管名字听起来有些高深,但它的原理并不复杂,即使是算法新手也能轻松理解。

记得有一次,我在一个项目中遇到了需要使用LCA算法的问题。当时我感到非常困惑,不知从何入手。经过一番努力,我终于掌握了这个算法。现在,我将详细为大家讲解LCA算法,帮助大家轻松掌握它。

首先,我们来了解一下什么是公共祖先。简单来说,就是给定一棵树,以及树上的两个节点,我们要找到这两个节点的公共祖先。例如,在下面这棵树中,节点A和节点D的公共祖先是节点B。

    A
   / \
  B   C
 / \
D   E

公共祖先在许多场景下都有应用,比如在二叉搜索树中查找两个节点的公共祖先,或者在并查集中查找两个节点的公共祖先。接下来,我们将详细探讨LCA算法的原理和实现。

LCA算法原理#

LCA算法的核心思想是:从根节点开始,分别向上遍历两个节点,直到找到它们的公共祖先。具体步骤如下:

  1. 从根节点开始,向上遍历节点p和节点q。
  2. 如果节点p和节点q的父节点相同,则继续向上遍历。
  3. 如果节点p和节点q的父节点不同,则将其中一个节点的父节点设置为另一个节点的父节点,并继续向上遍历。
  4. 当节点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)算法有了更深入的了解。虽然这个算法听起来有些复杂,但其实只要掌握了核心思想,就能轻松实现。希望这篇文章能帮助到大家,让我们一起在算法的世界里不断探索吧!😉

评论

© 2026 松岛川树