Eliminarea unui arbore binar de căutare

Dacă îndepărtarea este necesar să se ia în considerare trei cazuri [3]:

1. Dacă nodul îndepărtat nu are fii, acesta va fi îndepărtat fără ajustarea suplimentară a arborelui (Fig. 4.6 (a)).

2. În cazul în care nodul îndepărtat are un singur subarbore, singurul lui copil poate fi plasat până ia locul (Fig. 7.6 (b)).

3. Dacă îndepărtat nodul p are două subramificații, ea e receptor într-un mod simetric (sau un precursor al acestuia într-o manieră simetrică) trebuie să ia locul. Un descendent într-o manieră simetrică nu poate fi lăsat subramificație (ca și cum ar avea copilul său ar fi lăsat p receptor într-o manieră simetrică). Astfel, elementul fiu dreapta s poate fi mutat în sus pentru a lua locul lui (fig. 4.6 (a)).

Fig. 4.6. Eliminarea nodurilor dintr-un arbore binar de căutare

și - îndepărtarea cu un ansamblu cheie 15;

b - unitatea 5 îndepărtarea cu o cheie;

în - îndepărtarea de asamblare cu o cheie de 11

În următorul algoritm, arborele rămâne același, în cazul în care nu există un nod cu cheia.

// căutare site-ul cu cheie. Setați p astfel încât să fie

// la acest site și q - tatăl său, dacă acesta există

în timp ce ((p! = NULL) (P-> k! = Key))

în cazul în care (cheiek) p = p-> din stânga;

cout<<”такого ключа нет в дереве. Дерево остается не измененным \n”;

// Setați variabila v nodul, care înlocuiește p.

// sterge nodul are maxim un fiu

if (p-> din stânga == NULL) v = p> drept;

altceva (dacă P-> dreapta == NULL) v = p> din stânga;

// altceva p nod are doi fii

// Setați succesorul v p în mod simetric,

// o variabila t - tatăl lui v

s = v-> din stânga; // s - stânga, fiul v

// La acest punct, v este succesorul nodului p

// într-o manieră simetrică

// p este tatăl variabilei v, u v = t-> din stânga.

// Sterge nod v din poziția sa actuală și înlocuiți-l cu nodul v copil dreapta

// înființat fiii lui V, astfel că ei erau fii ai lui p

// se inserează nodul v în poziția deținute anterior de nodul p

if (q == NULL) // nod p a fost rădăcina arborelui