一、创建一个结点
struct node{
int v,height; //v结点权值 height当前子树高度
node *lchild,*rchild; //左右孩子结点地址
}*root;
node* newNode(int v){
node* Node = new node; //申请一个node型变量的地址空间
Node->v = v; //结点权值为v
Node->height = 1; //结点高度初始为1
Node->lchild = Node->rchild = NULL; //初始状态下没有左右孩子结点
return Node; //返回新建结点的地址
}
二、获取、更新结点子树高度,获取节点当前平衡因子
//获取root的子树高度
int getHeight(node* root){
if(root == NULL) return 0;
return root->height;
}
//更新root的height
void updateHeight(node *root){
//max(左子树高度,右子树高度)+ 1
root->height = max(getHeight(root->lchild),getHeight(root->rchild)) + 1;
}
//获取root的平衡因子
int getBalanceFactor(node *root){
//左子树的高度减去右子树的高度
return getHeight(root->lchild) - getHeight(root->rchild);
}
三、左旋和右旋操作
//左旋
void L(node *&root){
node* temp = root->rchild;
root->rchild = temp->lchild;
temp->lchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
//右旋
void R(node *&root){
node* temp = root->lchild;
root->lchild = temp->rchild;
temp->rchild = root;
updateHeight(root);
updateHeight(temp);
root = temp;
}
四、结点的插入
void insert(node* &root, int v){
if(root == NULL){ //到达空结点
root = newNode(v);
return;
}
if(v < root->v){ //v比根结点权值小
insert(root->lchild,v); //往左子树插入
updateHeight(root); //更新root当前的子树高度
if(getBalanceFactor(root) == 2){
if(getBalanceFactor(root->lchild) == 1) R(root); //LL型
else if(getBalanceFactor(root->lchild) == -1){ //LR型
L(root->lchild);
R(root);
}
}
}else{
insert(root->rchild,v);
updateHeight(root);
if(getBalanceFactor(root) == -2){
if(getBalanceFactor(root->rchild) == -1) L(root); //RR型
else if(getBalanceFactor(root->rchild) == 1){ //RL型
R(root->rchild);
L(root);
}
}
}
}
五、主函数
int main(){
int n,v;
scanf("%d",&n);
for(int i=0; i<n; i++){
scanf("%d",&v);
insert(root,v);
}
printf("%d\n",root->v); //输出AVL树根结点的权值
return 0;
}