AVL樹,平衡二叉樹的LL,LR ,RR,RL旋轉
//////////////////////////////////////////////////////////////
////////////建立平衡二叉樹的調整
////////////@xomlee 20131227#include <stdio.h>
#include <Windows.h>typedef struct AVLTree
{
int data;
struct AVLTree *LTree;
struct AVLTree *RTree;
struct AVLTree *parent;
}AVLTree;AVLTree * ROOT = NULL;
//////////////////////////////////////////////////////////////
////////////建立平衡二叉樹
void InsertBi_Tree(AVLTree **tree,int nInsertValue)
{
if (*tree == NULL) // 判斷 NULL 樹
{
(*tree) = (AVLTree*)malloc(sizeof(AVLTree));
(*tree) ->data = nInsertValue;
(*tree) ->LTree = NULL;
(*tree) ->RTree = NULL;
(*tree) ->parent = NULL;
return;
}AVLTree * temp = (*tree);
while(true)
{
if(temp ->data > nInsertValue) // 放在左邊
{
if (temp ->LTree == NULL)
{
temp ->LTree= (AVLTree*)malloc(sizeof(AVLTree));
temp ->LTree ->parent = temp;
temp ->LTree ->data = nInsertValue;
temp ->LTree ->LTree = NULL;
temp ->LTree ->RTree = NULL;
break;
}
else
{
temp = temp ->LTree;
}
}
else
{
if (temp->RTree == NULL)
{
temp ->RTree = (AVLTree*)malloc(sizeof(AVLTree));
temp ->RTree ->parent = temp;
temp->RTree->data= nInsertValue;
temp->RTree->LTree = NULL;
temp->RTree->RTree = NULL;
break;
}
else
{
temp = temp->RTree;
}
}
}
}//////////平衡二叉樹的調整=========LL && LR=============================
//判斷是左不平衡還是右不平衡,將不平衡的結點傳進去,調整完返回傳進來的子樹AVLTree * changeBiTreeWeight_r(AVLTree *pTree)
{
AVLTree *LchildTree ;
LchildTree = pTree ->LTree;//標記傳進來的結點的左孩子pTree ->LTree = LchildTree ->RTree;//改變根節點的左孩子
LchildTree ->RTree = pTree;//調整左孩子的右子樹if(NULL == pTree ->parent)
{
pTree = LchildTree;
}
else if(pTree ->parent ->LTree == pTree)
{
pTree ->parent ->LTree = LchildTree ;//改變父親節點}
else
{
pTree ->parent ->RTree = LchildTree;
}LchildTree ->parent = pTree ->parent;
pTree ->parent = LchildTree;if(pTree ->LTree)
{
pTree ->LTree ->parent = pTree;
}
return LchildTree;
}
AVLTree * changeBiTreeWeight_l(AVLTree *pTree)
{
AVLTree *RchildTree ;
RchildTree = pTree ->RTree;//標記傳進來的結點的you孩子pTree ->RTree = RchildTree ->LTree;//改變根節點的you孩子
RchildTree ->LTree = pTree;//調整you孩子的zuo子樹if(NULL == pTree ->parent)
{
pTree = RchildTree;
}
else if(pTree ->parent ->RTree == pTree)
{
pTree ->parent ->RTree = RchildTree ;//改變父親節點}
else
{
pTree ->parent ->LTree = RchildTree;
}RchildTree ->parent = pTree ->parent;
pTree ->parent = RchildTree;if(pTree ->RTree)
{
pTree ->RTree ->parent = pTree;
}
return RchildTree;
}AVLTree * createBitree(AVLTree *tree)
{InsertBi_Tree(&tree,4);
InsertBi_Tree(&tree,2);
InsertBi_Tree(&tree,5);
InsertBi_Tree(&tree,1);
InsertBi_Tree(&tree,3);return tree;
}void MyPrint(AVLTree *pTree)
{
if(pTree)
{
MyPrint(pTree ->LTree);
printf("%d ",pTree ->data);
MyPrint(pTree ->RTree);
}
}int main()
{
AVLTree * root = NULL;
root = createBitree(root);
MyPrint(root);
printf("\n======================\n");root = changeBiTreeWeight_l(root);
MyPrint(root);
printf("\n======================\n");//root = changeBiTreeWeight_r(root);
//MyPrint(root);
return 0;
}