自己写的bug应该很多
BinHeapNode.h
#include<iostream>
using namespace std;
class BinHeap;
class BinHeapNode
{
private:
friend BinHeap;
int key;
BinHeapNode*parent;
BinHeapNode*child;
BinHeapNode*sibling;
int degree;
int maxsize;
public:
BinHeapNode(int num):key(num),parent(NULL),child(NULL),sibling(NULL),degree(0){}
~BinHeapNode()
{
}
void Destory()
{
}
};
BinHeap.h
#include"BinHeapNode.h"
class BinHeap
{
private:
BinHeapNode* head;
int Degree;
public:
BinHeap(int num):Degree(num),head(NULL){}
~BinHeap()
{
Destory1(head);
}
void Destory1(BinHeapNode*node)
{
if(node!=NULL)
{
Destory1(node->sibling);
Destory1(node->child);
delete node;
}
}
BinHeapNode* FindMinNum()
{
BinHeapNode *y=NULL,*p=head;
int min=0x7fffffff;
while(p)
{
if(p->key<min)
{
min=p->key;
y=p;
}
p=p->sibling;
}
return y;
}
//将以y为根的二项树和以z为根的二项树合并,使z为y的父节点
void BinLink(BinHeapNode* y,BinHeapNode*z)
{
y->parent=z;
y->sibling=z->child;
z->child=y;
z->degree++;
}
BinHeapNode*BinHeapMerge(BinHeapNode*head1,BinHeapNode*head2)
{
if(head1==NULL)
{
head1=head2;
return head1;
}
if(head2==NULL)
{
return head1;
}
BinHeapNode*x,*node1,*node2,*node3;
if(head1->degree<=head2->degree)
{
x=head1;
node1=x->sibling;
node2=head2;
}
else
{
x=head2;
node1=head1;
node2=head2->sibling;
}
node3=x;
while(node1&&node2)
{
if(node1->degree>node2->degree)
{
x->sibling=node2;
node2->parent=x;
x=node2;
node2=node2->sibling;
}
else
{
x->sibling=node1;
node1->parent=x;
x=node1;
node1=node1->sibling;
}
}
if(node1==NULL)
{
while(node2)
{
x->sibling=node2;
node2->parent=x;
x=node2;
node2=node2->sibling;
}
}
else
{
while(node1)
{
x->sibling=node1;
node1->parent=x;
x=node1;
node1=node1->sibling;
}
}
return node3;
}
void BinHeapUnion(BinHeapNode*head1,BinHeapNode*head2)
{
head=BinHeapMerge(head1,head2);
if(head==NULL)
return ;
BinHeapNode *prex=NULL,*x=head,*nextx=x->sibling;
while(nextx)
{
if(x->degree!=nextx->degree||(nextx->sibling!=NULL&&nextx->sibling->degree==x->degree))
{
prex=x;
x=nextx;
}
else if(x->key<=nextx->key)
{
x->sibling=nextx->sibling;
BinLink(nextx,x);
}
else
{
if(prex==NULL)
{
head=nextx;
head->parent=NULL;
}
else
prex->sibling=nextx;
BinLink(x,nextx);
x=nextx;
}
nextx=nextx->sibling;
}
}
void BinInsert(int x)
{
BinHeapNode*node=new BinHeapNode(x);
node->parent=NULL;
node->child=NULL;
node->sibling=NULL;
node->degree=0;
BinHeapUnion(head,node);
}
BinHeapNode*ExtractMin()
{
BinHeapNode*x=FindMinNum();
BinHeapNode*p=x->child;
while(p->sibling)
{
p=p->sibling;
}
BinHeapNode*q=p,*node;
while(q->parent)
{
q->sibling=q->parent;
q=q->parent;
}
q=p;
while(q->sibling)
{
q->sibling->parent=q;
q=q->sibling;
}
p->parent=NULL;
BinHeapUnion(head,p);
return x;
}
void BinHeapDceraseKey(BinHeapNode*x,int k)
{
if(k>x->key)
{
cout<<"error"<<endl;
return ;
}
x->key=k;
BinHeapNode*y=x;
BinHeapNode* z=y->parent;
while(z!=NULL&&y->key<z->key)
{
int temp;
temp=y->key;
y->key=x->key;
x->key=temp;
y=z;
z=z->parent;
}
}
void BinHeapDelete(BinHeapNode*node)
{
BinHeapDceraseKey(node,0);
ExtractMin();
}
void print(BinHeapNode*node)
{
if(node!=NULL)
{
print(node->sibling);
print(node->child);
cout<<"the key is : "<<node->key<<endl;
if(node->parent!=NULL)
{
if(node->parent->sibling==node)
cout<<"the node: "<<node->key<<" is the sibling of: "<<node->parent->key<<endl;
else
cout<<"the node: "<<node->key<<" is the child of: "<<node->parent->key<<endl;
}
else
cout<<"the partent of "<<node->key<<" is : NULL"<<endl;
}
}
void Print()
{
print(head);
}
};
test.cpp
#include"BinHeap.h"
int main()
{
int a[7]={12,7,25,15,28,41,33};
BinHeap heap1(4),heap(4);
int i;
/* for(i=0;i<7;i++)
{
heap1.BinInsert(a[i]);
}
heap1.Print();
*/
int b[19]={18,3,37,6,8,29,10,44,30,23,22,48,31,17,45,32,24,50,55};
BinHeap heap2(4);
for(i=0;i<19;i++)
{
heap2.BinInsert(b[i]);
}
heap2.Print();
return 0;
}