You are on page 1of 5

Arbori binari.

Completare Crearea arborelui binar corespunztor unei expresii aritmetice Operanzii se afl numai n noduri terminale iar operatorii numai n noduri interne. Nodurile sunt interpretate diferit (operanzi sau operatori), fie dup continutul lor, fie dup pozitia lor n arbore (terminale sau neterminale). Algoritmul de creare a arborelui pornind de la forma postfixat sau prefixat seamn cu algoritmul de evaluare a unei expresii postfixate (prefixate). Functia urmtoare foloseste o stiv de pointeri la noduri si creeaz (sub)arbori care se combin treptat ntr-un singur arbore final.
1

Arbori binari. Completare


Nod * Buidtree ( char * exp) // exp= sir postfixat terminat cu 0 {Stack s ; char ch; // s este o stiva de pointeri Nod* Nod* r=0; // r= adresa radacina subarbore initSt(s); // initializare stiva goala while (ch=*exp++) // repeta pana la sfarsitul expresiei exp { r=new Nod; // construire nod de arbore r->val=ch; // cu operand sau operator ca date if (isdigit(ch)) // daca ch este operand r->st=r->dr=0; // atunci nodul este o frunz else // daca ch este operator { r->dr =pop (s); // la dreapta un subarbore din stiva r->st= pop (s); // la stanga un alt subarbore din stiva } push (s,r); // pune radacina noului subarbore in stiva } return r; // radacina arbore creat { return(pop(s));} } 2

BST - continuare //AfisNod - afiseaza arborele indentat void AfisIndentat(Nod *r, int nivel) { int i; for(i=0; i<nivel; i++) cout<<"\t"; if(r==0) cout<<"-\n"; //se tipareste "-" pentru ceva vid else { cout<<r->data<<endl; AfisIndentat(r->stg, nivel+1); AfisIndentat(r->drt, nivel+1); } } Apel: AfisIndentat(rad, 1)
3

BST - continuare
Returneaza parintele nodului de pointer p din BST de radacina r

Nod* Parent (Nod* r, Nod* p) { Nod* q =r; // q va fi parintele lui p


if (r==NULL || r==p) return 0; if (p->val < q->val) if (q->st == p) return q; else return parent (q->st,p); if (p->val > q->val) if (q->dr == p) return q; else return parent (q->dr,p); // daca p nu are parinte // daca p in stanga lui q // q este parintele lui p // nu este q, //mai cauta in stanga lui q // daca p in dreapta lui q // q este parintele lui p // nu este q, //mai cauta in dreapta lui q
4

BST - continuare

Succesorului unui nod dat p, n parcurgere n inordine


Nod* succ (Nod* r,Nod* p) // NULL ptr nod cu valoare maxima { Nod* pp;
if (p->drt !=NULL) return Min(p->drt); // daca are fiu dreapta // atunci e minim din subarborele //dreapta pp = parent (r,p); // parinte nod p while ( pp != NULL && pp->drt==p)
{ p=pp; pp=parent(r,pp); } // de la parinte urca sus la stanga

return pp;

// ultimul nod cu fiu dreapta (sau NULL)


5