首页 > 代码库 > 左偏树
左偏树
</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); }
左偏树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。