tree merge( a, b )
tree a, b;
{
tree bota, botb, r, temp;
if ( a==NULL ) return( b );
else if ( b==NULL ) return( a );
else {
/*** Find bottom of a's rightmost edge ***/
bota = a->right; a->right = NULL;
/*** bottom of b's leftmost edge ***/
botb = b->left; b->left = NULL;
r = NULL;
/*** Merging loop ***/
while ( bota!=NULL && botb!=NULL )
if ( bota->k < botb->k ) {
temp = bota->right;
if ( r==NULL ) bota->right = bota;
else {bota->right = r->right;
r->right = bota;
};
r = bota;
bota = temp;
}
else {temp = botb->left;
if ( r==NULL ) botb->left = botb;
else {botb->left = r->left;
r->left = botb;
};
r = botb;
botb = temp;
};
/*** one edge is exhausted, finish merge ***/
if ( botb==NULL ) {
a->right = r->right;
r->right = bota;
return( a );
}
else {b->left = r->left;
r->left = botb;
return( b );
}
}
};
|