左式堆合并的实现

原创 2013年12月05日 09:20:31

这是第一篇博客,相信是个不错的开始!
//define the leftist heap struct
typedef struct Leftist pLeftist;
struct Leftist{

	int element;
	pLeftist left, right;
	int npl;
};

//build the merged leftist heap and return it
pLeftist BuildHeap(LeftistQueue q){

	Leftist h1, h2;

	while(!IsEmpty(q)){
		h1 = Dequeue(q);
		if(IsEmpty(q))
			return h1;		//the leftist heap has been built
		h2 = Dequeue(q);

		Enqueue(q, Merge(h1, h2));	//enqueue the new merged leftist heap
	}

	return NULL;	//there is no leftist heap in queue
}

pLeftist Merge(Leftist h1, Leftist h2){

	if(!h1)
		return h2;
	if(!h2)
		return h1;	

	if(h1->element<h2->element)		//compare the element and choose the root
		return MergeHeap(h1, h2);
	else
		return MergeHeap(h2, h1);
}

pLeftist MergeHeap(Leftist h1, Leftist h2){

	if(!h1->left){
		h1->left = h2;		//single node
	}else{
		h1->right = Merge(h1->right, h2);
		if(h1->left->npl<h1->right->npl)	//make left child's npl >= right's
			SwapChl(h1);
		h1->npl = h1->right->npl+1;		//make the npl equalling its right child+1
	}

	return h1;	//return the root
}

左式堆而言,较于小根堆

1.合并速度快,O(n)

2.链表比数组带来更多的开销,并且多一个域(npl)

3.代码相对复杂,其实也不复杂


较于leftist heap,有个skew heap,每次合并都左右换一下,不需要(npl),如果数据是随机的,也是一个很不错的选择


有个同学说随机删除堆里的一个元素,这样的方法比较好:

将改点的值置为负无穷,然后冒泡到顶部,再删去顶部,将剩下的两个子树合并。


不过,堆似乎不是用来随机删除节点的。一般指删最小的,以前遇到过一个题目,在最小的三个元素中删除一个特定的,这样就可以在前三层找(应该是7个元素中),然后删,随机删除其中的任意节点得不偿失。

还有,删除任意节点,将其子树合并,合并获得的新树的根放回原来删除节点的位置,这样不是很合理吗,为何要冒泡到最顶部?



相关文章推荐

优先队列中左式堆的合并算法

//LeftistHeap是一个左式堆,本次主要描述的是对左式堆的合并操作的实现。其中包括创建左式堆的结构。 //左式堆的特点:对于堆中的每一个节点X,左儿子的零路径长至少与右儿子的零路径长相等。 ...

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

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

左式堆的合并

二叉堆对于合并操作是困难的,因为需要把一个数组拷贝到另一个数组。左式堆可以高效的地支持合并操作, 左式堆与二叉树之间唯一区别是,左式堆不是平衡的,可能非常趋向不平衡。// 左式堆的结构 typedef...
  • zxhio
  • zxhio
  • 2017年03月10日 11:33
  • 133

左式堆的简单实现(C语言描述)

左式堆左式堆是优先队列的一种实现,它的目的主要是为了解决二叉堆的合并问题.(你将在后面看到左式堆是如何用递归来优美地进行合并的)零路径长把任意节点X的零路径长(null path length, NP...

左式堆--C语言实现

leftheap.h#ifndef _LEFTHEAP_H_ #define _LEFTHEAP_H_ #define Insert(X,H) (H=Insert1((X),H)) #define D...
  • fktr_70
  • fktr_70
  • 2016年01月01日 11:03
  • 296

数据结构之左式堆的实现

左式堆是一种很有意思的二叉树,他与二叉堆即优先队列一样,具有堆序性质,唯一的区别在于他并非完全的平衡,而是偏左的,对任意一个节点x,左儿子的零路径长至少与右儿子的零路径长一样大,所谓的零路径长是从x到...

LeftistHeap左式堆的C++实现

算法导论4.14:构造一个堆,包含k个堆中所有元素。算法的复杂度是多少?思路这题可以用Divide and Conquer,迭代分组合并两个堆。假设每个堆元素最多为n个,用数组实现的算法因为每次mer...

优先队列——左式堆的实现

零路径长度(null path length, NPL),NPL(X)定义为从X到一个没有两个儿子的节点的最短路径的长。因此具有0个或1个儿子的节点的NPL为0,而NPL(NULL) = -1。 左式...

左式堆C源代码

  • 2012年01月08日 20:22
  • 52KB
  • 下载

什么是左式堆

什么是左式堆? 左式堆定义: 具有,如下性质 1、父节点属性值小于子节点属性值; 2、堆中的任何节点,其左儿子的零路径长>=右儿子的零路径长; 的二叉树。 ...
  • sean_gn
  • sean_gn
  • 2012年03月05日 18:06
  • 883
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:左式堆合并的实现
举报原因:
原因补充:

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