AVL树的插入操作(分4种情况):
AC代码:
#include <bits/stdc++.h>
using namespace std;
struct node{
int x;
struct node *lchild,*rchild;
};
node* LL(node* root){
node *t=root->lchild;
root->lchild=t->rchild;
t->rchild=root;
return t;
}
node* RR(node* root){
node *t=root->rchild;
root->rchild=t->lchild;
t->lchild=root;
return t;
}
node* LR(node* root){
root->rchild=LL(root->rchild);
return RR(root);
}
node* RL(node* root){
root->lchild=RR(root->lchild);
return LL(root);
}
int getDepth(node* root){
if(root==NULL) return 0;
return max(getDepth(root->lchild),getDepth(root->rchild))+1;
}
node* Insert(node* root,int x){
if(root==NULL){
root=new node();
root->x=x;
root->lchild=root->rchild=NULL;
}
else{
if(x<root->x){
root->lchild=Insert(root->lchild,x);
if(getDepth(root->lchild)-getDepth(root->rchild)==2)
root=x<root->lchild->x?LL(root):RL(root);
}
else{
root->rchild=Insert(root->rchild,x);
if(getDepth(root->lchild)-getDepth(root->rchild)==-2)
root=x>root->rchild->x?RR(root):LR(root);
}
}
return root;
}
map<int,int>pos;
int maxIndex=0;
void dfs(node* root,int index){
if(root!=NULL){
pos[index]=root->x;
maxIndex=max(maxIndex,index);
dfs(root->lchild,index*2);
dfs(root->rchild,index*2+1);
}
}
int main(){
// freopen("1.txt","r",stdin);
int n,x;
scanf("%d",&n);
node *root=NULL;
for(int i=0;i<n;i++){
scanf("%d",&x);
root=Insert(root,x);
}
dfs(root,1);
for(auto it=pos.begin();it!=pos.end();it++){
if(it!=pos.begin()) printf(" ");
printf("%d",it->second);
}
printf("\n%s",maxIndex==n?"YES":"NO");
return 0;
}