数据结构--堆结构

学习数据结构的记录,未完待续。。。。

一、最大-最小堆

1.定义

  最小-最大堆是一个满足一下性质的完全二叉树:该二叉树不为空,二叉树的各层交替为最大层与最小层,且根结点为最小层。如果x位于最小层,则x是以x为根节点的子二叉树中的最小值。如果x位于最大层,则x是以x为根节点的子二叉树中的最大值。

以上是具有12个元素的最小-最大堆

 

2.最大-最小堆插入

当要插入新的元素 j 时

有四种情况:

(1)当 j.parent 是最小层:

       1. 当 j  〉=j.parent 时,只需 在最大层执行简单的维护堆的操作。

        2.当 j 〈 j . parent 是,将j 与 j.parent 调换,然后在最小堆上执行维护堆的操作

(2)当 j.parent 是最大层:

       1. 当 j 〉= j.parent 时,将j 与 j.parent 调换,然后在最大堆上执行维护堆的操作

        2.当 j 〈 j . parent 是,只需 在最小层执行简单的维护堆的操作。

 

代码如下:

#define MAX_SIZE 100 /* maximum size of heap plus 1 */
#define false 0
#define true 1
#define SWAP( x, y, t ) ( ( t ) = ( x ), ( x ) = ( y ), ( y ) = ( t ) )
typedef struct{
	int key;
	/* other fields */
}element;
element heap[MAX_SIZE];

bool level( int i ){
	// if i is max return true
	// else return false

	int temp;
	temp = (int)( log10( i ) / log10( 2 ) ) + 1;
	if( temp % 2 ){
		return false;
	}else{
		return true;
	}
}

void max_min_insert( element heap[], int *n, element item ){
	/* insert item into max_min heap */
	int parent;
	(*n)++;
	if( *n == MAX_SIZE ){
		//.....
		exit( 1 );
	}

	parent = (*n) / 2;
	
	if( !parent ){
		heap[1] = items;
	}else{
		switch (level(parent)){
		
		case false ://min level
			if( item.key < heap[parent].key ){
				heap[*n] = heap[parent];
				verify_min( heap, parent, item );
			}else{
				verify_max( heap, *n, item );
			}
			break;
		
		case true ://min level
			if( item.key > heap[parent].key ){
				heap[*n] = heap[parent];
				verify_max( heap, parent, item );
			}else{
				verify_min( heap, *n, item );
			}
		
		default:
			break;
		}
	
	}
}

void verify_max( element heap[], int i, element item ){
	/* follow the nodes from the max node i to the root and insert item into its proper place */
	int grandparent = i / 4;
	while( grandparent ){
		if( heap[grandparent].key < item.key ){
			heap[i] = heap[grandparent];
			i = grandparent;
			grandparent /= 4;
		}else{
			break;
		}
	}
	heap[i] = item;
}

void verify_min( element heap[], int i, element item ){
	/* follow the nodes from the min node i to the root and insert item into its proper place */
	int grandparent = i / 4;
	while( grandparent ){
		if( heap[grandparent].key > item.key ){
			heap[i] = heap[grandparent];
			i = grandparent;
			grandparent /= 4;
		}else{
			break;
		}
	}
	heap[i] = item;
}


 

3.删除最小元素

相关文章
相关标签/搜索