菜鳥一枚,
剛剛學習數據結構與算法,
爲了加深理解,
所以與同學們分享學習過程。
今天學習的是,
平衡二叉樹!!!
平衡二叉樹(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); //進行右旋,使之平衡
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-> =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;
}
}
}
}
}
若有錯誤的地方,請同學們指出。
謝謝同學們的閱讀!!!