对于二项队列;
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;
} 