在二分查找树中查找两个节点的最低共同祖先 - 有效

时间:2012-09-23 12:08:07

标签: algorithm

只是想知道以下算法在二叉搜索树中找到两个节点的最低共同祖先的效率。

Node getLowestCommonAncestor (Node root, Node a, Node b) {

   Find the in-order traversal of Node root.
   Find temp1 = the in-order successor of Node a.
   Find temp2 = the in-order successor of Node b.

   return min (temp1, temp2);
}

3 个答案:

答案 0 :(得分:8)

在二叉搜索树中搜索最低共同祖先比这更简单:观察LCA是第一次搜索项目A和项目B的节点。

从根开始,同时搜索A和B.只要两次搜索都指向同一方向,请继续搜索。到达节点后,搜索A和B会将您带到不同的子树,您知道当前节点是LCA。

答案 1 :(得分:2)

大型二元搜索树底部的节点可以有一个接近它的有序后继节点,例如,如果它是节点的左子节点,则其有序后继节点是其父节点。

从根的不同子节点下降的两个节点将根作为它们最不常见的祖先,无论它们在哪里,所以我相信你的算法会出现这种情况。

这是对http://en.wikipedia.org/wiki/Lowest_common_ancestor处有效LCA算法(给定时间构建预备数据结构)的讨论,并附有代码指针。

找到LCA的一种低效但简单的方法如下:在树中保留从子节点到父节点的指针以及每个节点深度的注释。给定两个节点,如果相同,则从最深的节点向上移动直到深度。如果您指向另一个节点,则它是LCA。否则,从每个节点向上移动一步并再次检查,依此类推,直到您在LCA会面。

答案 2 :(得分:0)

寻找BST的LCA是正确的:

  

查找不同的node1node2所在的节点   两侧。但如果node1node2的祖先,我们也会如此   必须返回node1。下面的代码实现了这个算法。


TreeNode<K> commonAncestor(TreeNode t, K k1, K k2){
        if(t==null) return null;
        while(true)
        {
           int c1=t.k.compareTo(k1);
           int c2=t.k.compareTo(k2);
           if(c1*c2<=0)
           {
               return t;
           }
           else
           {
               if(c1<0)
               {
                   t = t.right;
               }
               else
               {
                   t = t.left;
               }
           }
        }
    }