PAT.A1066 Raíz del árbol AVL

Volver a contenidos

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

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

  1. 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.
  2. 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
  3. 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;
}
Publicados 177 artículos originales · ganado elogios 5 · Vistas 6660

Supongo que te gusta

Origin blog.csdn.net/a1920993165/article/details/105518182
Recomendado
Clasificación