0001 template <typename T> BNP<T> meld(BNP<T> a, BNP<T> b) { //左式堆的融合(迭代版) 0002 if (!a) return b; if (!b) return a; //退化情况 0003 if (*a < *b) swap(a, b); //确保a>=b 0004 for ( ; a->rc; a = a->rc) //沿右侧链做二路归并,直至堆a->rc先于b变空 0005 if (*(a->rc) < *b) //只有在a->rc < b时才需做实质的操作 0006 { b->parent = a; swap(a->rc, b); } //接入b的根节点(及其左子堆) 0007 (a->rc = b)->parent = a; //直接接入b的残余部分(必然非空) 0008 for ( ; a; a->npl = NPL(a->rc) + 1, b = a, a = a->parent) //沿右侧链逐层回溯、更新npl 0009 if (NPL(a->lc) < NPL(a->rc)) //若有必要(宏隐藏了边界情况) 0010 swap(a->lc, a->rc); //通过flip确保右子堆的npl不大 0011 return b; //返回融合后的堆顶 0012 } //本算法只实现结构上的融合,堆的规模须由上层调用者负责更新