# 左式堆合并的实现

这是第一篇博客，相信是个不错的开始！

//define the leftist heap struct
typedef struct Leftist pLeftist;
struct Leftist{

int element;
pLeftist left, right;
int npl;
};

//build the merged leftist heap and return it
pLeftist BuildHeap(LeftistQueue q){

Leftist h1, h2;

while(!IsEmpty(q)){
h1 = Dequeue(q);
if(IsEmpty(q))
return h1;		//the leftist heap has been built
h2 = Dequeue(q);

Enqueue(q, Merge(h1, h2));	//enqueue the new merged leftist heap
}

return NULL;	//there is no leftist heap in queue
}

pLeftist Merge(Leftist h1, Leftist h2){

if(!h1)
return h2;
if(!h2)
return h1;

if(h1->element<h2->element)		//compare the element and choose the root
return MergeHeap(h1, h2);
else
return MergeHeap(h2, h1);
}

pLeftist MergeHeap(Leftist h1, Leftist h2){

if(!h1->left){
h1->left = h2;		//single node
}else{
h1->right = Merge(h1->right, h2);
if(h1->left->npl<h1->right->npl)	//make left child's npl >= right's
SwapChl(h1);
h1->npl = h1->right->npl+1;		//make the npl equalling its right child+1
}

return h1;	//return the root
}

1.合并速度快，O(n)

2.链表比数组带来更多的开销，并且多一个域(npl)

3.代码相对复杂，其实也不复杂

• 本文已收录于以下专栏：

举报原因： 您举报文章：左式堆合并的实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)