数据结构_左式堆


头文件 _LeftHeap.h

#ifndef _LeftHeap_H

struct TreeNode;
typedef struct TreeNode *PriorityQueue;

PriorityQueue Initialize( void );
ElementType FindMin( PriorityQueue H );
int IsEmpty( PriorityQueue H );
PriorityQueue Merge( PriorityQueue H1, PriorityQueue H2 );

/* 为了兼容二叉堆 */
#define Insert( X, H ) ( H = Insert1( ( X ), H ) )
#define DeleteMin( H ) ( FindMin( H ); DeleteMin1( H ) )

PriorityQueue Insert1( ElementType X, PriorityQueue H );
PriorityQueue DeleteMin1( PriorityQueue H );

#endif

struct TreeNode
{
	ElementType Element;
	PriorityQueue Left;
	PriorityQueue Right;
	int Npl;
};

主要例程 _LeftHeap.c

PriorityQueue Initialize( void )
{
	return NULL;
}

PriorityQueue Merge( PriorityQueue H1, PriorityQueue H2 )
{
	if( H1 == NULL )
		return H2;
	if( H2 == NULL )
		return H1;
	if( H1->Element < H2->Element )
		return Merge1( H1, H2 );
	else
		return Merge1( H2, H2 );
}

static PriorityQueue Merge1( PriorityQueue H1, PriorityQueue H2 )
{
	if( H1->Left == NULL )
		H1->Left = H2;
	else
	{
		H1->Right = Merge( H1->Right, H2 );
		if( H1->Left->Npl < H1->Right->Npl )
			SwapChildren( H1 );

		H1->Npl = H1->Right->Npl + 1;
	}
	return H1;
}

void SwapChildren( PriorityQueue H )
{
	if( H == NULL )
	{
		printf( "PriorityQueue is empty!" );
		exit( 1 );
	}
	PriorityQueue TempCell;
	TempCell = H->Left;
	H->Left = H->Right;
	H->Right = TempCell;
}

PriorityQueue Insert1( ElementType X, PriorityQueue H )
{
	PriorityQueue SingleNode;

	SingleNode = malloc( sizeof( struct TreeNode ) );
	if( SingleNode == NULL )
	{
		printf( "Out of space!!!" );
		exit( 1 );
	}
	else
	{
		SingleNode->Element = X;
		SingleNode->Npl = 0;
		SingleNode->Left = SingleNode->Right = NULL;
		H = Merge( SingleNode, H );
	}
	return H;
}

PriorityQueue DeleteMin1( PriorityQueue H )
{
	PriorityQueue LeftHeap, RightHeap;

	if( IsEmpty( H ) )
	{
		printf( "PriorityQueue is empty!" );
		return H;
	}
	LeftHeap = H->Left;
	RightHeap = H->Right;
	free( H );
	return Merge( LeftHeap, RightHeap );
}

ElementType FindMin( PriorityQueue H )
{
	if( H == NULL )
	{
		printf( "PriorityQueue is empty!" );
		exit( 1 );
	}
	return H->Element;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注