• 左偏树


    </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
    ",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("
    ");
    	InOrder(T);
    }


  • 相关阅读:
    js相关小实例——滚动监听
    js相关小实例——进度条
    数据库的连接
    php函数
    php语法
    php基础上
    列表 选择背景变化
    飞入
    移动列表内容
    javascript的语法
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6995047.html
Copyright © 2020-2023  润新知