c - 有没有更好的方法来找到最低共同祖先?

标签 c binary-search-tree least-common-ancestor

我知道以前有人问过类似的问题,但我认为我的解决方案要简单得多。特别是与 Wikipedia 相比.

请证明我错了!

如果您有一棵树,其节点具有给定的数据结构:

struct node
{
    node * left;
    node * right;
    node * parent;
    int key;
}

你可以这样写一个函数:

node* LCA(node* m, node* n)
{
    // determine which of the nodes is the leftmost
    node* left = null;
    node* right = null;
    if (m->key < n->key)
    {
        left = m;
        right = n;
    }
    else
    {
        left = n;
        right = m;
    }
    // start at the leftmost of the two nodes,
    // keep moving up the tree until the parent is greater than the right key
    while (left->parent && left->parent->key < right->key)
    {
        left = left->parent;
    }
    return left;
}

这段代码非常简单,最坏的情况是 O(n),平均情况可能是 O(logn),特别是如果树是平衡的(其中 n 是树中的节点数)。

最佳答案

我觉得你的算法没问题,至少我想不出更好的算法。请注意,您不需要父指针;相反,您可以从根开始沿着树向下,找到其键位于两个初始键之间的第一个节点。

但是,您的问题与 Tarjan 解决的问题无关。首先,你考虑二叉树,他考虑n叉树;但这可能是一个细节。更重要的是,您考虑的是搜索树,而 Tarjan 考虑的是一般树(不对键进行排序)。您的问题要简单得多,因为根据 key ,您可以猜测某个节点在树中的位置。

关于c - 有没有更好的方法来找到最低共同祖先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056992/

相关文章:

algorithm - 如何在二叉树中找到节点的第一个共同祖先?

c - 无法在eclipse juno中编译C

c - 在c中绘制二叉树到控制台

java - 二叉搜索树 - 插入

在 C99 中创建二叉搜索树

algorithm - 如何表示非二叉树以及如何对该树进行 LCA?

algorithm - 最低共同祖先算法

c - 没有从我的 C 代码中获得正确的球体体积?

c - 在 C 中包含 wiiuse.h

c - 无法破译我老师的伪代码