数据结构与算法-学习笔记(6)-平衡二叉树

菜鸟一枚,
刚刚学习数据结构与算法,
为了加深理解,
所以与同学们分享学习过程。

今天学习的是,
平衡二叉树!!!

平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

AVL实现方法图解:
在这里插入图片描述
在这里插入图片描述
代码实现:

#define LH 1   //节点的左子树比右子树深1
#define EH 0   //节点的左子树和右子树一样深度
#define RH -1   //节点的右子树比左子树深1

typedef struct BiTNode
{
	int data;
	int bf;   //平衡因子,即LH、EH、RH
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;



void R_Rotate(BiTree *p)   //右旋
{
	BiTree L;
	L = (*P)->lchild;
	(*p)->lchild = L->rchild;
	L->rchild = (*p);
	*p = L;
}

void LeftBalance(BiTree *T)
{
	BiTree L,Lr;
	L = (*T)->lchild;    //有一个左子树
	
	switch(L->bf)  //增加一个子树
	{
		case LH:             //再来一个左子树
			(*T)->bf = L->bf = EH;   //此时进行旋转,变成平衡
			R_Rotate(T);  //进行右旋,使之平衡
			breakcase 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-> =LH;
					break;
			}
			Lr->bf = EH;
			L_Rotate(&(*T)->lchild);
			R_Rotate(T);
	}
}
int InsertAVL(BiTree *T , int e,int *taller)
{
	if(!*T)
	{
		*T = (BiTree)malloc(sizeof(BiTNode));   //建立一个新结点
		(*T)->data = e;
		(*T)->lchild = (*T)->rchild = NULL;
		(*T)->bf = EH;
		*taller = TURE;
	}
	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 = TURE;
						break;
					case RH:    //节点有一个右子树的状态下,加一个左子树
						(*T)->bf = EH;
						*taller = FALSE;
						break;
				}
			}	
		}
		else
		{
			if(!InsertAVL(&(*T)->lchild, e , taller))
			{
				return FALSE;
			}
			if(*taller)
			{
				switch((*T)->bf)
				{
					case LH:
						(*T)->bf = EH;
						*taller = FALSE;
						break;
					case EH:
						(*T)->bf =RH;
						*taller = TURE;
						break;
					case RH:
						RightBalance(T);
						*taller = FALSE;
						break;
				}
			}	
		}
	}
}

若有错误的地方,请同学们指出。
谢谢同学们的阅读!!!

发布了28 篇原创文章 · 获赞 15 · 访问量 1062

猜你喜欢

转载自blog.csdn.net/qq_43765237/article/details/105381936
今日推荐