1. Descripción del título
Especificación de entrada:
Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene un número entero positivo N (≤20) que es el número total de claves a insertar. Luego, se dan N claves enteras distintas en la siguiente línea. Todos los números de una línea están separados por un espacio.
Especificación de salida:
Para cada caso de prueba, imprima la raíz del árbol AVL resultante en una línea.
Entrada de muestra 1:
5
88 70 61 96 120
Salida de muestra 1:
70
Entrada de muestra 2:
7
88 70 61 96120 90 65
Salida de muestra 2:
88
Dos ideas para resolver problemas
Esta pregunta es una pregunta del árbol AVL relativamente completa, que básicamente involucra todas las operaciones del árbol AVL, y es muy adecuada para la consolidación después de aprender el árbol AVL. Para obtener conocimientos específicos, consulte la explicación sobre el árbol AVL en "Notas de algoritmo".
Tres, código de CA
#include<iostream>
#include<algorithm>
using namespace std;
struct Node //建立结点结构体
{
int key;
Node* lchild, *rchild;
};
Node* rotateLeft(Node* root) //左旋操作
{
Node *t = root->rchild;
root->rchild = t->lchild;
t->lchild = root;
return t;
}
Node* rotateRight(Node* root) //右旋操作
{
Node *t = root->lchild;
root->lchild = t->rchild;
t->rchild = root;
return t;
}
Node* rotateLeftRight(Node* root) //先左旋再右旋
{
root->lchild = rotateLeft(root->lchild);
return rotateRight(root);
}
Node* rotateRightLeft(Node* root) //先右旋再左旋
{
root->rchild = rotateRight(root->rchild);
return rotateLeft(root);
}
int getHeight(Node* root) //获取高度
{
if(root == NULL) return 0;
return max(getHeight(root->lchild), getHeight(root->rchild)) + 1;
}
Node* insert(Node *root, int val) //AVL树的插入
{
if(root == NULL)
{
root = new Node();
root->lchild = NULL;
root->rchild = NULL;
root->key = val;
return root;
}
else if(val < root->key)
{
root->lchild = insert(root->lchild, val);
if(getHeight(root->lchild) - getHeight(root->rchild) == 2)
root = val < root->lchild->key ? rotateRight(root) : rotateLeftRight(root);
}
else
{
root->rchild = insert(root->rchild, val);
if(getHeight(root->rchild) - getHeight(root->lchild) == 2)
root = val > root->rchild->key ? rotateLeft(root) : rotateRightLeft(root);
}
return root;
}
int main()
{
int N, val;
scanf("%d", &N);
Node *root = NULL;
for(int i=0; i<N; i++)
{
scanf("%d", &val);
root = insert(root, val);
}
printf("%d", root->key);
return 0;
}