C数据结构的平衡二叉树的练习

#include "stdio.h"    
#include "stdlib.h"   

#include "math.h"  
#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100 /* 存储空间初始分配量 */

typedef int Status;	/* Status是函数的类型,其值是函数结果状态代码,如OK等 */ 


/* 二叉树的二叉链表结点结构定义 */
typedef  struct BiTNode	/* 结点结构 */
{
	int data;
	int bf;
	struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;


/* 对以p为根的二叉排序树作右旋处理, */
/* 处理之后p指向新的树根结点,即旋转处理之前的左子树的根结点 */
void R_Rotate(BiTree *P)
{ 
	 BiTree L;
	 L=(*P)->lchild;
	 (*P)->lchild=L->rchild;
	 L->rchild=(*P);
	 *P=L;
}

/* 对以P为根的二叉排序树作左旋处理, */
/* 处理之后P指向新的树根结点,即旋转处理之前的右子树的根结点0  */
void L_Rotate(BiTree *P)
{ 
	BiTree R;
	R=(*P)->rchild;
	(*P)->rchild=R->lchild;
	R->lchild=(*P);
	*P=R;
}

#define LH +1 /*  左高 */ 
#define EH 0  /*  等高 */ 
#define RH -1 /*  右高 */ 

/*  对以指针T所指结点为根的二叉树作左平衡旋转处理 */
/*  本算法结束时,指针T指向新的根结点 */
void LeftBalance(BiTree *T)
{ 
	BiTree L,Lr;
	L=(*T)->lchild;
	switch(L->bf)
	{
		case LH:
		(*T)->bf=L->bf=EH;
		R_Rotate(T);
		break;
		case RH:
		Lr=L->rchild;
		switch(Lr->bf)
		{
			case LH: (*T)->bf=RH;
			         L->bf=EH;
			         break;
		    case EH: (*T)->bf=L->bf=EH;
		            break;
		    case RH: (*T)->bf=EH;
		             L->bf=LH;
		             break;
		}
		Lr->bf=EH;
		L_Rotate(&(*T)->lchild);
		R_Rotate(T);
	}
}

/*  对以指针T所指结点为根的二叉树作右平衡旋转处理, */ 
/*  本算法结束时,指针T指向新的根结点 */ 
void RightBalance(BiTree *T)
{ 
	BiTree R,Rl;
	R=(*T)->rchild;
	switch (R->bf)
	 {
		case RH:
			(*T)->bf=R->bf=EH;
			L_Rotate(T);
			break;
		case LH:
			Rl=R->lchild;
			switch (Rl->bf)
			 {
				case RH: (*T)->bf=LH;
						 R->bf=EH;	
					     break;
				case EH: (*T)->bf=R->bf=EH;
					     break;
			    case LH: (*T)->bf=EH;
			             R->bf=RH;
					     break;
			}
			Rl->bf=EH;
			R_Rotate(&(*T)->rchild);
			L_Rotate(T);
	}
}

/*  若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个 */ 
/*  数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树 */ 
/*  失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。 */
Status InsertAVL(BiTree *T,int e,Status *taller)
{  
	if(!*T)
	{
		*T=(BiTree)malloc(sizeof(BiTNode));
		(*T)->data=e;
		(*T)->lchild=(*T)->rchild=NULL;
		(*T)->bf=EH;
		*taller=TRUE;
	}
	else
	{
		if(e==(*T)->data)
		{
			*taller=FALSE;
			return FALSE;
		}
		if(e<(*T)->data)
		{
			if(!InsertAVL(&(*T)->lchild,e,taller))
			return FALSE;
			if(*taller)
			{
				switch ((*T)->bf)
				 {
					case LH:
						LeftBalance(T);
						*taller=FALSE;
						break;
					case EH:
						(*T)->bf=LH;
						*taller=TRUE;
						break;
					case RH:
						(*T)->bf=EH;
						*taller=FALSE;
						break;
				}
			}
		}
	else
	{
		if(!InsertAVL(&(*T)->rchild,e,taller))
		return FALSE;
		if(*taller)
		{
			switch ((*T)->bf) 
			{
				case LH:
				(*T)->bf=EH;
				*taller=FALSE;
					break;
				case EH:
				(*T)->bf=RH;
				*taller=TRUE;
					break;
				case RH:
					RightBalance(T);
					*taller=FALSE;			
				    break;
			}
		}
	}
 }
 return TRUE;
}

int main(void)
{    
	int i;
	int a[10]={3,2,1,4,5,6,7,10,9,8};
	BiTree T=NULL;
	Status taller;
	for(i=0;i<10;i++)
	{
		InsertAVL(&T,a[i],&taller);
	}
	printf("本样例建议断点跟踪查看平衡二叉树结构");
	return 0;
}

你可能感兴趣的:(c语言,开发语言)