******** fig6.55 ********** PRIORITY_QUEUE merge( PRIORITY_QUEUE H1, PRIORITY_QUEUE H2 ) { PRIORITY_QUEUE H3; tree_ptr T1, T2, T3; /*1*/ if( H1 == NULL ) /*2*/ return H2; /*3*/ if( H2 == NULL ) /*4*/ return H1; /*5*/ if( H1->rank < H2->rank ) { /*6*/ T1 = extract( H1 ); /* extract is a macro */ /*7*/ H3 = merge( H1, H2 ); /*8*/ T1->l_sib = H3->l_sib; /*9*/ H3->l_sib->r_sib = NULL; /*10*/ T1->r_sib = H3; H3->l_sib = T1; /*11*/ return T1; } /*12*/ if( H2->rank < H1->rank ) /*13*/ return merge( H2, H1 ); /* Otherwise, first two trees have same rank */ /*14*/ T1 = extract( H1 ); T2 = extract( H2 ); /*15*/ H3 = merge( H1, H2 ); /*16*/ T3 = merge_tree( T1, T2 ); /*17*/ return merge( T3, H3 ); }