左偏树

原创 2015年07月10日 00:19:48
</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);
}


可并堆——左偏树 Leftist Heap

今天学习了左偏树,这是一个好理解而且好写的数据结构,和二叉堆一样可以在O(1)时间内取出优先级最高的值,O(logn)时间内删除优先级最高的值,不同的是如果要合并两个堆那么二叉堆就只能跪了。而左偏树能...
  • CSDNCJava
  • CSDNCJava
  • 2014年03月24日 11:23
  • 1543

【数据结构与算法】左偏树(堆)的实现

左偏树,也可以称之为左式堆。称其为树,是因为其存储结构通常采用二叉树,所以可以认为是一种特殊的二叉树。称其为堆,是因为在逻辑结构上,它属于可合并堆的一种。其实数据结构中最欣欣向荣的两个分支就是:平衡树...
  • theprinceofelf
  • theprinceofelf
  • 2012年02月10日 10:26
  • 6039

【模板】左偏树 (模板题:洛谷P3377左偏树/可并堆)

题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个...
  • zj_yuneng
  • zj_yuneng
  • 2017年05月26日 13:20
  • 212

【NOI集训】【XJ】可持久化左偏树

http://hzxjhs.com:83/contest/456 果断可并堆 #include #include #include #include #include #includ...
  • Owen_hzt
  • Owen_hzt
  • 2015年07月05日 21:03
  • 1499

POJ 3666 Making the Grade(左偏树)

题意:给出一串数,改变当个数字的大小的代价是改动的绝对值(比如2变成5,代价是3),求让这个数串变成非递减(或非递增)数列的最小代价。 下面只讨论非递减的情况(非递增类似): 做法非常神奇,是黄源河...
  • u013595779
  • u013595779
  • 2015年03月02日 23:11
  • 1107

【HDU】5960 Subsequence 【可持久化左偏树维护K短路】

题目链接:Subsequence吐槽,先是对着定义yy了可持久化二项堆,然后发现不好搞这个k短路,然后找了左偏树的定义,对着yy了20分钟写出了可持久化左偏树,然后过了poj2449后就1A了这个题。...
  • u013368721
  • u013368721
  • 2016年10月31日 15:56
  • 918

左偏树的正确性和复杂度分析

左偏树,也可以称之为左式堆。称其为树,是因为其存储结构通常采用二叉树,所以可以认为是一种特殊的二叉树。称其为堆,是因为在逻辑结构上,它属于可合并堆的一种。其实数据结构中最欣欣向荣的两个分支就是:平衡树...
  • OIljt12138
  • OIljt12138
  • 2016年04月24日 16:21
  • 637

左偏树介绍

左偏树是一种优先队列,虽然有些简陋,但它可以比较高效的实现队列的合并操作,所以在一些涉及到最值,以及合并的问题中,不妨考虑下这种数据结构。...
  • dpppBR
  • dpppBR
  • 2016年06月27日 23:05
  • 456

BZOJ1975【左偏树】

卡Priority_queue的内存简直是不忍直视. /* I will wait for you */ #include #include #include #include #inc...
  • Lethelody
  • Lethelody
  • 2015年07月12日 11:35
  • 1041

【洛谷】3377【模板】左偏树(可并堆)

题目传送门 作为一个合格的蒟蒻,我们当然在学每一种算法后都要去做一些和这种算法有关的模板题。 毫无疑问,这是一道左偏树的模板题。 伏地膜大佬,这位大佬对左偏树的解释十分到位。 左偏树就是在...
  • lyfsb
  • lyfsb
  • 2017年05月03日 18:55
  • 720
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左偏树
举报原因:
原因补充:

(最多只允许输入30个字)