Volver a contenidos
Titulo
Construya un árbol AVL (árbol de ordenación binario balanceado).
Muestra (se puede copiar)
5
88 70 61 96 120
//output
70
7
88 70 61 96 120 90 65
//output
88
Puntos a tener en cuenta
- Esta pregunta es más difícil. Si no puede hacerlo en el examen PAT, puede enviar directamente la mediana. Puede pasar 5 de los 7 puntos de prueba y obtener 17 puntos.
- El árbol AVL (árbol de clasificación binaria balanceada) debe satisfacer: ① es un árbol de clasificación binaria, es decir, todos los nodos en el subárbol izquierdo de cada nodo del árbol son menores que el nodo, y todos los nodos en el subárbol derecho de cada nodo son mayores que Nodo ② El valor absoluto de la diferencia entre las alturas izquierda y derecha de cada nodo no puede exceder 1
- En el proceso de construcción de un árbol binario equilibrado, hay cuatro situaciones que deben rotarse: LL, LR, RR, RL. En cada caso, gire a la izquierda o derecha para ver el código de referencia a continuación. En la simulación de escritura a mano, usualmente utilizamos el método de intercambio, pero en el código real, podemos asignar directamente el valor.
Mediana directa (17 minutos)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,data[25];
cin>>n;
for(int i=0;i<n;i++)scanf("%d",&data[i]);
sort(data,data+n);
printf("%d",data[n/2]);
return 0;
}
AVL
#include<bits/stdc++.h>
using namespace std;
struct node{
int v,height;
node *lc,*rc;
}*root;
node* newnode(int v){
node* no=new node;
no->v=v;
no->height=1;
no->lc=no->rc=NULL;
return no;
}
int getheight(node* root){
if(root==NULL)return 0;
return root->height;
}
int getbalancenum(node* root){
return getheight(root->lc)-getheight(root->rc);
}
void L(node* &root){
node* tmp=root->rc;//tmp为新的root
root->rc=tmp->lc;//把tmp->rc裁剪下来
tmp->lc=root;
//只有root和tmp的高度发生了变化
root->height=max(getheight(root->lc),getheight(root->rc))+1;
tmp->height=max(getheight(tmp->lc),getheight(tmp->rc))+1;
root=tmp;
}
void R(node* &root){
node* tmp=root->lc;
root->lc=tmp->rc;
tmp->rc=root;
root->height=max(getheight(root->lc),getheight(root->rc))+1;
tmp->height=max(getheight(tmp->lc),getheight(tmp->rc))+1;
root=tmp;
}
void insert(node* &root,int v){
if(root==NULL){
root=newnode(v);
return;
}
if(v<root->v){
insert(root->lc,v);
root->height=max(getheight(root->lc),getheight(root->rc))+1;
if(getbalancenum(root)==2){
if(getbalancenum(root->lc)==1){//LL型
R(root);//右旋
}else if(getbalancenum(root->lc)==-1){//LR型
L(root->lc);//先左旋
R(root);//再右旋
}
}
}else{
insert(root->rc,v);
root->height=max(getheight(root->lc),getheight(root->rc))+1;
if(getbalancenum(root)==-2){
if(getbalancenum(root->rc)==-1){//RR型
L(root);//左旋
}else if(getbalancenum(root->rc)==1){//RL型
R(root->rc);//先右旋
L(root);//再左旋
}
}
}
}
int main(){
int n,v;
cin>>n;
while(n--){
cin>>v;
insert(root,v);
}
printf("%d\n",root->v);
return 0;
}