题目
思路
AVL树的动态调整操作:二叉搜索树的Insert操作+AVL调整操作
核心代码
typedef struct TreeNode* BT;
struct TreeNode{
int data;
BT left;
BT right;
int BF;
};
int height(BT Tree)
{
int hl,hr,max;
if(Tree==NULL) return 0;
else{
hl=height(Tree->left);
hr=height(Tree->right);
max=(hl>hr)?hl:hr;
return(max+1); }
}
int BF(BT Tree)
{
if(Tree==NULL) return 0;
else return (height(Tree->left)-height(Tree->right));
}
BT singleLeft(BT A)
{
BT B=A->left;
A->left=B->right;
B->right=A;
A->BF=BF(A);
B->BF=BF(B);
return B;
}
BT singleRight(BT A)
{
BT B;
B=A->right;
A->right=B->left;
B->left=A;
A->BF=BF(A);
B->BF=BF(B);
return B;
}
BT LR_rotation(BT A)
{
A->left=singleRight(A->left);
return singleLeft(A);
}
BT RL_rotation(BT A)
{
A->right=singleLeft(A->right);
return singleRight(A);
}
BT insert(BT Tree,int data)
{
if(Tree==NULL){
Tree=(BT)malloc(sizeof(struct TreeNode));//attention
Tree->data=data;
Tree->left=Tree->right=NULL;
Tree->BF=BF(Tree);
}
else{
if(Tree->data<data){
Tree->right=insert(Tree->right,data);
if(BF(Tree)==-2){
if(data>Tree->right->data) Tree=singleRight(Tree);
else Tree=RL_rotation(Tree);
}
}
else if(Tree->data>data){
Tree->left=insert(Tree->left,data);
if(BF(Tree)==2){
if(data<Tree->left->data) Tree=singleLeft(Tree);
else Tree=LR_rotation(Tree);
}
}
}
Tree->BF=BF(Tree);
return Tree;//有时候插入元素即便 不需要调整结构,也可能需要重新计算一些平衡因子。
}
BT PlantTree(int N)
{
int data;
int _BF;
scanf("%d",&data);
BT Tree,position,new_position;
Tree=(BT)malloc(sizeof(struct TreeNode));
Tree=NULL;
for(int i=0;i<N;i++){
scanf("%d",&data);
Tree=insert(Tree,data);}
return Tree;
}