左偏树

原创 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);
}


左偏树和其特点

  • 2008年04月11日 15:40
  • 374KB
  • 下载

HDU1512 左偏树||斜堆

本来我是在开开心心(泪流满面)地刷Scapegoat Tree的,结果突然间就看见了一个奇奇怪怪的东西——斜堆。 因为昨天刚好学了左偏树,于是就来回忆了一发,然后发现。。。。。。。。。 既然有斜堆了为...
  • nlj1999
  • nlj1999
  • 2016年01月17日 16:27
  • 310

左偏树入门

  • 2015年07月28日 21:29
  • 1.28MB
  • 下载

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

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

左偏树论文-黄源河

  • 2015年10月27日 22:41
  • 311KB
  • 下载

左偏树总结

左偏树总结
  • CHNWJD
  • CHNWJD
  • 2017年06月03日 21:18
  • 142

ZOJ 2334 Monkey King(左偏树)

题目链接:点击打开链接 思路:左偏树模板题, 需要维护集合关系, 这个可以用并查集很方便的维护, 另外需要用一个数组来维护每个点所在的左偏树编号。 细节参见代码: #include #inclu...

BZOJ 1455 罗马游戏 左偏树

题目大意:给定n个点,每个点有一个权值,提供两种操作: 1.将两个点所在集合合并 2.将一个点所在集合的最小的点删除并输出权值 很裸的可并堆 n 左偏树就是快啊~ #include #inc...
  • PoPoQQQ
  • PoPoQQQ
  • 2014年11月04日 21:04
  • 1265
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左偏树
举报原因:
原因补充:

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