一種二叉堆實現

二叉堆結構性質:是一顆完全二叉樹

二叉堆堆序性質:最小元在根上,而且左右子樹也一個二叉堆

#include<stdio.h>
#include<stdlib.h>

#define ElementType int

struct binary_heap {
	int capacity;
	int size;
	ElementType *Elements;
};

struct binary_heap *H;

int init_binary_heap(int size)
{
	if(NULL == H)
	{
		H = malloc(sizeof(struct binary_heap));
		if(NULL == H)
		{
			printf("Error: out of memory!!\n");
			return -1;
		}
		H->Elements = malloc(sizeof(ElementType)*(size + 1));
		if(NULL == H->Elements)
		{
			printf("Error: out of memory!!\n");
			return -1;
		}
		H->capacity = size;
		H->size = 0;
		H->Elements[0] = -1;//標記
	}
	return 0;
}

int insert_binary_heap(ElementType e)
{
	int i;
	if(H->size + 1 > H->capacity)
	{
		printf("Error: the binary heap is already full!!\n");
		return -1;
	}
	for(i = ++H->size;H->Elements[i] = e,H->Elements[i] < H->Elements[i/2];i = i/2)
	{	
		H->Elements[i] = H->Elements[i/2];
	}
	H->Elements[i] = e;
	return 0;
}

ElementType delete_min_binary_heap(void)
{
	ElementType result;
	int i;
	if(H->size == 0)
	{
		printf("Error: the binary heap is already empty!!\n");
		return -1;
	}
	//先獲得二叉堆的根
	result = H->Elements[1];
	H->Elements[1] = H->Elements[H->size];
	//如果存在左分支,且根的值大於左分支的值,則進行下慮
	i = 1;
	while(2*i <= H->size)
	{
		//判斷是否同時有左右分支
		if(2*i + 1 <= H->size)
		{
			//根大於左,根大於右
			if(H->Elements[i] > H->Elements[2*i] && H->Elements[i] > H->Elements[2*i+1])
			{
				if( H->Elements[2*i] < H->Elements[2*i+1])
				{
					H->Elements[i] = H->Elements[2*i];
					H->Elements[2*i] = H->Elements[H->size];
					i = 2*i;
				}
				else
				{
					H->Elements[i] = H->Elements[2*i+1];
					H->Elements[2*i+1] = H->Elements[H->size];
					i = 2*i+1;
				}
			}
			//根大於左,根小於右
			else if(H->Elements[i] > H->Elements[2*i] && H->Elements[i] < H->Elements[2*i+1])
			{
				 H->Elements[i] = H->Elements[2*i];
				 H->Elements[2*i] = H->Elements[H->size];
				 i = 2*i;
			}
			//根小於左,根大於右
			else if(H->Elements[i] < H->Elements[2*i] && H->Elements[i] > H->Elements[2*i+1])
			{
				H->Elements[i] = H->Elements[2*i+1];
				H->Elements[2*i+1] = H->Elements[H->size];
				i = 2*i+1;
			}
			else
			{
				break;
			}
		}
		//只有左分支
		else
		{
			if(H->Elements[i] > H->Elements[2*i])
			{
				H->Elements[i] = H->Elements[2*i];
				H->Elements[2*i] = H->Elements[H->size];
				i = 2*i;
			}
			else
			{
				break;
			}
		}
	}

	H->Elements[H->size] = 0;//將最後一個清零
	H->size--;
	return result;
}

void print_binary_heap(void)
{
	int i;
	printf("the current binary heap: ");
	for(i = 0;i < H->capacity + 1;i++)
		printf("%d ",H->Elements[i]);
	printf("\n");
	return;
}

int main(void)
{
	ElementType e;
	init_binary_heap(10);
	scanf("%d",&e);
	while(e != 0)
	{
		insert_binary_heap(e);
		scanf("%d",&e);
	}
	print_binary_heap();
	//delete操作
	while(H->size != 0)
	{
		e = delete_min_binary_heap();
		printf("get the min value from the curret binary heap is %d\n",e);
	}

	return 0;
}

運行結果:


發佈了36 篇原創文章 · 獲贊 11 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章