Structura laboratorului se gaseste in acest link.
BST este un arbore binar cu o structură specială adaptată căutărilor eficiente, având următoarele proprietăți:
Operații specifice BST
Operația de inserarea a unui element într-un BST adaugă elementul ca frunza a arborelui, iar mai apoi nodul cu cheia data va fi inserat ca fiu stâng sau drept in așa fel încât sa se respecte proprietatea BST.
Node* newNode(Data data) { Node* node = (Node*)malloc(sizeof(Node)); node->val = data; node->left = node->right = NULL; return node; } Node* insert(Node* node, int key) { // daca (sub)arborele e gol – se creeaza un nod //si se returneaza adresa if (node == NULL) return newNode(key); //altfel se coboara la stanga sau dreapta in arbore if (key < node->val) node->left = insert(node->left, key); else if (key > node->val) node->right = insert(node->right, key); //pointerul node se intoarce nemodificat pe acest return return node; } //nu se adauga elemente egale
Node* search(Node* root, int key) { //daca radacina e null sau s-a gasit elementul if (root == NULL || root->val == key) return root; //daca valoarea stocata in radacina e mai mica decat cheia if (root->val < key) return search(root->right, key); // daca valoarea stocata in radacina e mai mare decat cheia return search(root->left, key); } //daca nu se gaseste nod cu aceasta cheie se returneaza NULL
La partea de ștergere, trebuie avut în vedere:
Un AVL este un arbore binar de căutare echilibrat.(Proprietatea de echilibru trebuie respectata pentru fiecare nod - înălțimea subarborelui stâng al nodului diferă de inaltimea subarborelui drept al nodului prin cel mult o unitate). De asemenea, trebuie păstrată si condiția de BST.
Arbore binar complet - un arbore binar care este complet umplut cu posibila exceptie a ultimului nivel care este umplut de la stanga la dreapta
OBS! - arborii compleți sau perfecți sunt implicit echilibrați
typedef int Data; typedef struct N Node; struct N { int height; //inaltimea Data val; // datele efective memorate struct N *left,*right; // legatura catre subarbori };
OBS - înălțimea unui AVL este floor(log N), iar orice cautare/adaugare/stergere/gasire min/max de element se va realiza cu complexitatea O(log N) - cost amortizat pe mai multe operații.
Operația constă în inserția unui nod într-un BST, urmată de reechilibrarea arborelui. Există doua tipuri de rotații (care pastrează proprietatea BST):