Pe scurt
Un arbore binar complet are toate nivelurile pline. Dacă rădăcina este pe nivelul 0 și ultimul nivel este h, numărul total de noduri este 2^{h+1}-1. De exemplu, arborele cu 1 rădăcină și 2 fii are 3 noduri și este complet.
Un arbore binar aproape complet are toate nivelurile, în afară eventual de ultimul, pline; nodurile ultimului nivel ocupă primele locuri de la stânga. Arborele cu nodurile 1, 2, 3, 4, în această ordine pe niveluri, este aproape complet, dar nu complet: nivelul ultim conține numai nodul 4, fiul stâng al lui 2. Aceasta este forma folosită de heap.
În detaliu
Pentru reprezentarea secvențială a unui arbore binar aproape complet, cu indici de la 1, fiii nodului de pe poziția sunt pe și , când aceste poziții nu depășesc ; tatăl său este pe . Cu indici de la 0, pozițiile fiilor sunt și , iar tatăl este pe . Pe nivelul încap cel mult noduri, iar un arbore complet cu ultimul nivel are noduri, dintre care sunt frunze. Înălțimea arborelui aproape complet cu noduri este , dacă rădăcina este pe nivelul 0. Nu este nevoie de pointeri: poziția în vector determină legăturile.
Exemplul 1 — fiul stâng prin indice.
#include <iostream>
using namespace std;
int main() {
int v[] = {0, 1, 2, 3, 4};
int i = 2, n = 4;
if (2 * i <= n) cout << v[2 * i];
if (2 * i + 1 <= n) cout << " " << v[2 * i + 1];
}
Pozițiile sunt 1–4, iar v[0] este neutilizat. Pentru i=2, fiul stâng se află pe poziția 4 și are valoarea 4; poziția 5 a fiului drept depășește n, deci nodul 2 are un singur fiu și programul afișează 4. Forma arborelui nu impune ordinea valorilor; condiția de ordine apare separat la heap.
Exemplul 2 — niveluri, înălțime și frunze pentru . Programul află nivelul fiecărui nod împărțind repetat indicele la 2 până la 1 și numără frunzele, adică nodurile pentru care :
#include <iostream>
using namespace std;
int main() {
int n = 10, frunze = 0, h = 0;
for (int i = 1; i <= n; ++i) {
int x = i, nivel = 0;
while (x > 1) { x /= 2; ++nivel; }
cout << nivel << " ";
if (nivel > h) h = nivel;
if (2 * i > n) ++frunze;
}
cout << "\n" << h << " " << frunze;
}
Se afișează 0 1 1 2 2 2 2 3 3 3, apoi 3 5. Nivelurile conțin 1, 2, 4 și 3 noduri: primele trei sunt pline, iar ultimul are 3 noduri în loc de 8, așezate la stânga. Înălțimea este . Frunzele sunt nodurile 6, 7, 8, 9 și 10; nodul 5 are fiii 10 și 11, dar 11 depășește , deci doar fiul 10 există. Un arbore aproape complet cu noduri are frunze, adică nodurile de pe pozițiile .
Arbore complet. Cu 3 niveluri pline (înălțimea 2) sunt noduri, iar cu 4 niveluri pline sunt 15, dintre care 8 frunze. Un număr de noduri care nu are forma nu poate forma un arbore complet. De aceea arborele cu 4 noduri este aproape complet, dar nu complet.
Exemplu în formatul examenului. Un arbore binar aproape complet cu 11 noduri este memorat într-un vector cu indici de la 1. Care sunt fiii și tatăl nodului de pe poziția 5?
- a) fiii 9 și 10, tatăl 2
- b) fiii 10 și 11, tatăl 2
- c) fiii 10 și 11, tatăl 3
- d) fiul 10, tatăl 2
Răspunsul corect este b). Fiii sunt pe pozițiile și , iar ambele nu depășesc . Tatăl este pe poziția . Varianta a) folosește și în loc de și , iar varianta c) calculează greșit tatăl, ca . Varianta d) ar fi corectă pentru un arbore cu 10 noduri. În acest arbore, nodul de pe poziția 6 nu are fii, deoarece .
Greșeli frecvente
- Greșit: arborele cu patru noduri dispuse pe niveluri este complet.Corect: este aproape complet; pentru două niveluri pline sunt necesare 3 noduri, iar pentru trei niveluri pline, 7.
- Greșit: la indexarea de la 1, fiul stâng al poziției
ieste la2i+1.Corect: este la2i. - Greșit: „complet” înseamnă că valorile sunt sortate.Corect: numește forma arborelui, nu ordinea cheilor.
Testează-te pe această lecție
Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.
Înainte și după
Surse și referințe
Redactare proprie, conform programei:
- OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI intensiv; rocnee.eu
Documente consultate
- Programa școlară de informatică intensiv, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE, p. 4–5; rocnee.eu
- OpenDSA, „Array Implementation for Complete Binary Trees”, opendsa.cs.vt.edu/OpenDSA/Books/Catalog/html/CompleteTree.html
Desene: Redactare proprie (desen original), conform OMECI 5099/2009, anexa 5, Informatică XI intensiv, p. 4–5; rocnee.eu
