數據結構與算法-學習筆記(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;
				}
			}	
		}
	}
}

若有錯誤的地方,請同學們指出。
謝謝同學們的閱讀!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章