如何根据二叉搜索树(BST)中的后继计算父项

时间:2013-10-15 04:44:58

标签: algorithm data-structures binary-search-tree

正如标题所暗示的,如果我们在二进制搜索树(BST)中有节点x并且我们知道 x.successor 而不是 x.parent 的信息,我们也知道x.left和x.right。如何根据以上信息计算x.parent。

我决定在两种情况下分析它:( root有高度为0)

  1. 如果x没有正确的孩子, x.successor 的身高必须小于x。换句话说,x.successor位于x的“上层”。
  2. 如果x有正确的孩子, x.successor 的身高必须大于x。这意味着x.successor处于x的“较低级别”。
  3. 对于第一种情况,我们可以使用以下伪代码。

    y = x.succ
    if x.right == NIL
         z = y.left
         while x != z
             y = z;
             z = z.right
    return z
    

    如何处理第二种情况?如果x.right != NIL会发生什么?

                            15
    
                 6                       18
             3       7              17        19
           2   4       13                         20
                     9
    

    如何检索节点18和19的父节点,因为最右边的节点20没有后继节点,所以它将返回NIL。

1 个答案:

答案 0 :(得分:1)

我们无法始终根据您的信息获取父级。 例如,2个节点,nodeOne.right = x 我们只知道x left = null,right = null,successor = null 我们无法检索nodeOne

当x不在最右边的分支时,我们可以得到父(这意味着它有一些祖先的左分支包含x)。

算法可以是:

继续寻找合适的儿子,正确的孙子......,直到没有 然后得到继任者,并进入你的代码(你的代码有点错误?)

function getParent(Node node){
   Node right = node;
   for(;right.right != null; right = right.right){
   }
   Node successor = right.successor;
   if (successor == null)
     return null;

   if (successor.left == node)
     return successor;

   for(Node p = successor.left; p!= null; p=p.right){ 
     if (p.right == node){
       return p;
     }
   }
   return null;  
}