您的位置:首页 > 其它

左偏树

2015-07-10 00:19 344 查看
</pre><pre name="code" class="cpp">#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int key,dist;
struct node *Left,*Right;
}LeftistTree;
void Swap(LeftistTree** a,LeftistTree** b)
{
LeftistTree *tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
LeftistTree* Merge(LeftistTree *A,LeftistTree *B)
{
if(A == NULL)
return B;
if(B == NULL)
return A;
if(A->key < B->key)
{
Swap(&A,&B);
}
A->Right = Merge(A->Right,B);
if(A->Left == NULL)
{
A->Left = A->Right;
A->Right = NULL;
}
else
if(A->Right)
if(A->Right->dist > A->Left->dist)
Swap(&A->Left,&A->Right);
if(A->Right == NULL)
A->dist = 0;
else
A->dist = A->Right->dist + 1;
return A;
}
LeftistTree* MakeIntoTree(int x)
{
LeftistTree *T;
T = (LeftistTree*)malloc(sizeof(LeftistTree));
T->key = x;
T->dist = 0;
T->Left = T->Right = NULL;
return T;
}
LeftistTree* Insert(LeftistTree* A,int x)
{
LeftistTree *B;
B = MakeIntoTree(x);
A = Merge(A,B);
return A;
}

/*删除最大节点*/
int DeleteMax(LeftistTree** A)
{
int t = (*A)->key;
*A = Merge((*A)->Left,(*A)->Right);
return t;
}
/*中序输出*/
void InOrder(LeftistTree* T)
{
if(T->Left)
InOrder(T->Left);
printf("%d %d\n",T->key,T->dist);
if(T->Right)
InOrder(T->Right);
}
int main(void)
{
LeftistTree* T = NULL;
int n,a;
scanf("%d",&n);
while(n --)
{
scanf("%d",&a);
T = Insert(T,a);
InOrder(T);
}
DeleteMax(&T);
printf("\n");
InOrder(T);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: