平衡二叉树所涉及的一些算法

今晚整那个ubuntu,什么也没弄成,唉,把算法先保留一下吧, 插入函数还没理解透彻呢可怜可怜

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

#define    OK      1
#define    ERROR   0
#define    TRUE    1
#define    FALSE   0
#define    NULL    0

typedef    int     Status;
typedef    int     ElemType;
typedef    int     KeyType;

typedef struct BSTNode{
	ElemType      data;
	int           bf;         //结点平衡因子
	BSTNode       *lchild, *rchild;   //左右孩子指针
}BSTNode, *BSTree;

Status InitBSTree(BSTree &BT)   //初始化
{//操作结果:构造一个空的动态查找表BT
	BT=NULL;
	return OK;
}//InitBSTree

Status DestroyBSTree(BSTree &BT)     //销毁
{//初始条件:动态表已经存在。操作结果:销毁动态查找表BT
	if(BT)     //非空树
	{
         if(BT->lchild)   //有左孩子
		      DestroyBSTree(BT->lchild);  //递归法销毁左孩子子树
		 if(BT->rchild)   //有右孩子
			  DestroyBSTree(BT->rchild);  //递归法消去右孩子子树
		 free(BT);     //释放根结点
		 BT=NULL;
	}//if
	return OK;
}//DestroyBSTree

BSTree SearchBSTree(BSTree T, KeyType key)  //查找
{//在根指针T所指平衡二叉树中递归地查找某关键字等于key的数据元素
  //若查找成功,则返回指向该数据元素结点的指针,否则返回空指针。
   
	if(!T)
	{
		if(key == T->data)
			return T;     //查找结束;
		else if(key < T->data)
			return SearchBSTree(T->lchild, key);  //在左子树中查找
		else if(key > T->data)
			return SearchBSTree(T->rchild, key);  //在右子树中查找
	}//if
}//SearchBSTree

Status R_Rotate(BSTree &p)   //右旋
{//对以*p为根的二叉树作右旋处理,处理之后p指向新的树根结点,
 //即指向处理前的左子树的根结点(p的左孩子结点)

	BSTree lc;
	lc=p->lchild;     //lc指向左子树的根结点
	p->lchild = lc->rchild;   //lc的右子树挂接为p的左子树
	lc->rchild =p;
	p=lc;      //p指向新的根结点
    return OK;
}//R_Rotate

Status L_Rotate(BSTree &p)   //左旋
{
     BSTree rc;
	 rc=p->rchild;
	 p->rchild = rc->lchild;
	 rc->lchild=p;
	 p=rc;
	 return OK;
}//L_Rotate


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

Status LeftBalance(BSTree &T)  //左平衡旋转处理
{//对以指针T所指结点为根的二叉树作左平衡处理,
 //T指向新根结点
	
	BSTree lc, rd;
	lc=T->lchild;    //lc指向*T的左子树根结点
	switch(lc->bf)
	{//检查*T的左子树的平衡度,并作相应处理

	case LH://新结点插入在*T的左子树上,要做单右旋处理
		T->bf = lc->bf = EH;
		R_Rotate(T);
		break;
	case RH://新结点插入在*T的左孩子的右子树上,要做双旋处理
		rd=lc->rchild; //rd指向*T的左孩子的右子树根
		switch(rd->bf)
		{//修改*T及其左孩子的平衡因子
		case LH: T->bf=RH;
			     lc->bf=EH;
				 break;
		case EH: T->bf=lc->bf=EH;
			     break;
		case RH: T->bf=EH;
			     lc->bf=LH;
		}//switch
		rd->bf=EH;
		L_Rotate(T->lchild);//对*T的左子树做左旋平衡处理
        R_Rotate(T);  //对*T做右旋处理
	}//switch
	return OK;
}//LeftBalance

Status RightBalance(BSTree &T)  //右平衡旋转处理
{//对以T所指向的结点为根二叉树做右平衡处理,
  //T指向新的根结点

	BSTree rc, rd;
	rc=T->rchild;   //rc指向T的右子树根结点
	switch(rc->bf)
	{//检查*T的右子树的平衡度,并作相应平衡处理
	case RH: //新结点插入在右子树右子树上,单向左旋
		T->bf=rc->bf=EH;
		L_Rotate(T);
		break;
	case LH: //新结点插入在右子树的左子树上,双选处理
		rd=rc->lchild;//rd指向右子树的座子树根
		switch(rd->bf)
		{//修改*T及其右孩子的平衡因子
		case RH: T->bf=LH;
			     rc->bf=EH;
				 break;
		case EH: T->bf=rc->bf=EH;
			     break;
		case LH: T->bf=EH;
			     rc->bf=RH;
		}//switch
        rd->bf=EH;
		R_Rotate(T->rchild);//右子树右旋
		L_Rotate(T);    //对*T作左旋平衡处理
	}//switch
	return OK;
}//RightBalance

Status InsertElem(BSTree &T, ElemType e, Status &taller)
{//若不存在e则插入,返回1;否则返回0;若插入后失衡,则作相应平衡处理
 //taller记录树长高与否

	if(!T)
	{//插入新结点树长高,则置taller为TRUE
		T=(BSTree)malloc(sizeof(BSTNode));
		T->data=e;
		T->lchild=T->rchild=NULL;
		T->bf=EH;
		taller=TRUE;
	}
	else
	{
		if(e == T->data)
		{//存在相同结点,则不插入
			taller=FALSE;
			return FALSE;
		}//if
		if(e < T->data)
		{//应继续在T的左子树中搜索
            if(!InsertElem(T->lchild, e, taller))//未插入
				return FALSE;
			if(taller)  //已插入,且左子树长高
			{
                  switch(T->bf)//检查*T的平衡度
				  {
				  case LH://原本左高,需左平衡处理
					  LeftBalance(T);
					  taller=FALSE;
					  break;
				  case EH: //原本等高,左增高则树增高
					    T->bf=LH;
						taller=TRUE;
						break;
				  case RH: //原本右高,则左右等高
					     taller=FALSE;
				  }//switch
			}//if
			else
			{//应在T的右子树中搜索
				if(!InsertElem(T->rchild, e, taller))//未插入
					return FALSE;
				if(taller)
				{
					switch(T->bf)//检查T的平衡度
					{
					case LH: T->bf=EH;
						     taller=FALSE;
							 break;
					case EH: T->bf=RH;
						      taller=TRUE;
							  break;
					case RH: RightBalance(T);
						taller=FALSE;
					}
				}

			}

		}
	}
	return OK;

}


 

posted on 2011-12-06 02:20  java课程设计例子  阅读(175)  评论(0编辑  收藏  举报