# 左偏树

509人阅读 评论(0)

</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);
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：18037次
• 积分：486
• 等级：
• 排名：千里之外
• 原创：32篇
• 转载：1篇
• 译文：0篇
• 评论：0条
评论排行