Un arbore binar poate fi reprezentat cu ajutorul adreselor
înlãnţuite. Fiecare nod al arborelui conţine informaţia utilã asociatã nodului respectiv şi adresele fiului stâng şi drept. struct arbore { unsigned int i; arbore *st,*dr;} *a; Operaţii cu arbori: 1. creare: Modul recursiv de definire a unui arbore binar conduce şi la ideea de a folosi o metodã recursivã de creare a arborelui. Se citeşte informaţia utilã a nodului, se alocã spaţiu pentru el, se completeazã informaţia utilã şi se construiesc subarborii stâng şi drept. Pentru introducerea datelor se completeazã mai întâi fiecare nod care nu are doi fii cu unul sau doi fii cãrora li se asociazã valoarea 0. Arborele astfel completat se parcurge în preordine.
2 3
4 5
Pentru arborele din figurã se vor introduce în ordine, valorile:
2. traversare: Traversarea unui arbore constã în parcurgerea
într-o anumitã ordine, o singurã datã, a nodurilor sale, în vederea prelucrãrii informaţiei asociate nodurilor. Existã trei modalitãţi mai importante de traversare a unui arbore: în preordine: se viziteazã rãdãcina şi apoi, tot în preordine se viziteazã nodurile subarborelui stâng şi apoi cele ale subarborelui drept. Parcurgerea în preordine a arborelui din figurã este: 1 2 3 4 6 5 void preordine(arbore *a) { if(a!=0) { cout<<a->i<<” “; preordine(a->st); preordine(a->dr); } }
în inordine: se viziteazã în inordine nodurile subarborelui
stâng, apoi rãdãcina şi apoi, tot în inordine nodurile subarborelui drept. Parcurgerea în inordine a arborelui din figurã este: 2 1 4 6 3 5 void inordine(arbore *a) { if(a!=0) { inordine(a->st); cout<<a->i<<” “; inordine(a->dr); } }
în postordine: se viziteazã în postordine nodurile
subarborelui stâng, apoi tot în postordine nodurile subarborelui drept şi la sfârşit rãdãcina. Parcurgerea în postordine a arborelui din figurã este: 2 6 4 5 3 1 void postordine(arbore *a) { if(a!=0) { postordine(a->st); postordine(a->dr); cout<<a->i<<” “; } }
3. inserarea unui nod ca nod terminal, la un nod care conţine
o valoare datã arbore *cautare(arbore *a,unsigned int v) { if(a!=0) { if(a->i==v) return a; cautare(a->st,v); cautare(a->dr,v); } }
void ins(arbore *a,int k,int x)
{ arbore *nou; arbore *b=cautare(a,k); if(b==0) { cout<<"NU exista nodul respectiv in arbore"; return; } if(b->st) if(b->dr) { cout<<"Nodul are deja doi fii"; return; } else { nou=new(arbore); nou->i=x; nou->st=nou->dr=0; b->dr=nou; } else { nou=new(arbore); nou->i=x; nou->st=nou->dr=0; b->st=nou; } } 4. ştergerea unui nod terminal, care conţine o valoare datã
void adresa_tata(arbore *a, arbore *&t,unsigned int n)