You are on page 1of 3

Arbori binari

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:


1 2 0 0 3 4 0 6 0 0 5 0 0

arbore *creare()
{ arbore *x;
Unsigned int n;
cin>>n;
if(n==0) return 0;
else { x=new(arbore);
x->i=n;
x->st=creare();
x->dr=creare();
return x; } }

void *creare(arbore *&a)


{ unsigned int n;
cin>>n;
if(n==0) a=0;
else { a=new(arbore);
a->i=n;
a->st=creare();
a->dr=creare(); } }

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)


{ if(a->st->i==n || a->dr->i==n) t=a;
if(a!=0) { adresa_tata(a->st,t,n);
adresa_tata(a->dr,t,n); } }
void eliminare(arbore *a,unsigned int n)
{ arbore *c;
adresa_tata(a,c,n);
if(c->st->i==n) c->st=0;
else c->dr=0; }