首页 > 试题广场 >

对于二项队列; a. 当调用Merge(H,H)时会发

[问答题]
对于二项队列;
a. 当调用Merge(H,H)时会发生什么情况?修改代码以修正该问题。
b. 如果在H2中没有树留下且Carry树为NULL,修改下列Merge例程以终止合并。
c. 修改Merge使得较小的树总被合并到较大的树中。
BinQueue
Merge(BinQueue H1, BinQueue H2)
{
      BinTree T1, T2, carry = NULL;
      int i, j;
      if (H1->CurrenSize + H2 -> CurrentSize > Capacity)
            Error("Merge would exceed capacity");
      H1->CurrentSize += H2 -> CurrentSize; 
      for(i-0, j=1; j<=H1->CurrentSize; i++, j*=2)
      {
             T1=H1->TheTrees[i]; T2 = H2->TheTrees[i];
             switch(!!T1+2*!!T2 +4*!!Carry)
             {
                    case 0: /*No trees*/
                    case 1: /*Only H1*/
                            break;
                    case 2: /* Only H2*/
                           H1->TheTrees[i] = T2;
                           H2->TheTrees[i] = NULL;
                           break;
                    case 3: /* Only Carry*/
                           H1-> TheTrees[i] = Carry;
                           Carry = NULL;
                           break;
                     case 4:    /*H1 and H2*/
                           Carry = CombineTrees(T1,T2);
                           H1-> TheTrees[i] = H2-> TheTrees[i]=NULL;
                           break;
                     case 5:  /* H1 and Carry*/
                            Carry = CombineTrees(T1,Carry);
                            H1->TheTrees[i] = NULL;
                    case 6: /*H2 and Carry*/
                            Carry = CombineTrees(T2,Carry);
                            H2->TheTrees[i] = NULL;
                    case 7: /* All three /
                            H1-> TheTrees[i] = Carry;
                            Carry = CombineTrees(T1,T2);
                           H2 - > TheTrees[i] = NULL;
                           break;
                 }
           }
           return H1;
}

这道题你会答吗?花几分钟告诉大家答案吧!