noduri interne arborelui, care au att predecesor ct i succesori (unul sau mai muli);
Exemple:
1)arbore ternar complet:
2) arbore oarecare:
Exemplu:
n lime: 1,2,3,4,5,6,7,8,9,10,11
n adncime: 1,2,5,6,10,11,3,4,7,8,9
typedef struct
{ int dim;
int m[Max][Max];
} MAT;
void latime(MAT a, int incep)
{ int coada[n.dim],vizit[n.dim];
int prim,ultim,lin,i,j,n;
n=a.dim;
for(i=1;i<=n;i++) vizit[i]=0;
coada[1]=incep;
vizit[incep]=1;
ultim=1;prim=1;
do
{ lin=coada[prim];
for (j=1;j<=n;j++)
if ((a.m[lin][j]==1) && (vizit[j]==0))
{ coada[++ultim]=j;
vizit[j]=1;
}
prim++;
}
while (ultim<n);
cout<<"parcurgerea in latime incepand cu nodul "<<incep<<" este: ";
for (i=1;i<=n;i++) cout<<setw(2)<<coada[i];
cout<<endl;
}
void adancime(MAT a, int incep)
{ int stiva[a.dim], vizit[a.dim];
int prim,ultim,lin,j, n=a.dim;
for (j=1;j<=n;j++) vizit[j]=0;
prim=1;ultim=1;
stiva[1]=incep;
vizit[incep]=1;
while (prim>0)
{ lin=stiva[prim];
j=1;
while (j<=n)
{ if (a.m[lin][j]==0 || vizit[j]==1) j++;
else { stiva[++ultim]=j;
vizit[j]=1;
prim=ultim+1;
j=n+1;
}
}
prim=prim-1;
}
cout<<"parcurgerea in adancime incepand cu nodul "<<incep<<" este: ";
for (int i=1;i<=n;i++) cout<<setw(2)<<stiva[i];
cout<<endl;
La reprezentarea n memorie a unui arbore binar, pe lnga informaia propriu-zis se vor memora n fiecare nod i
adresele de legatur spre nodurile succesoare n felul urmtor:
Prin traversarea unui arbore binar vom nelege parcurgerea tuturor vrfurilor arborelui, trecnd o singur dat prin
fiecare nod.
n funcie de ordinea (disciplina) de vizitare a nodurilor unui arbore binar, traversarea poate fi n preordine,
n inordine sau n postordine.
Traversarea n preordine este aceea n care se parcurge mai nti nodul rdcin, apoi subarborele stng i
dup aceea subarborele drept. Deci se parcurge arborele n ordinea (Rdcin, SubarboreStng, SubarboreDrept).
Evident, definiia este recursiv, parcurgerea unui subarbore fiind facut dupa aceai regul, deci ncepnd cu
rdcina. O procedur n Pseudocod corespunzatoare se d n continuare.
Procedur Preordine (R:Arbore);
Daca R<>Null
Atunci
Prelucrare (R.Info);
Preordine (R.ArboreStang);
Preordine (R.ArboreDrept)
Sfarsit Daca
Sfarsit Preordine;
Traversarea n inordine(fixordine) este aceea n care se parcurge mai nti subarborele stng, apoi nodul
rdcin i dup aceea subarborele drept. Deci se parcurge arborele n ordinea (SubarboreStng, Rdcin,
SubarboreDrept). O procedur n Pseudocod corespunzatoare se d n continuare.
Procedur Inordine (R:Arbore);
Daca R<>Null
Atunci
Inordine (R.ArboreStang);
Prelucrare(R.Info);
Inordine (R.ArboreDrept)
Sfarsit Daca
Sfarsit Preordine;
Traversarea n postordine este aceea n care se parcurge mai nti subarborele stng, apoi subarborele drept i
dup aceea nodul rdcin. Deci se parcurge arborele n ordinea (SubarboreStng, SubarboreDrept, Rdcin). O
procedur n Pseudocod corespunzatoare se d n continuare.
Procedur Postordine (R:Arbore);
Daca R<>Null
Atunci
Postordine (R.ArboreStang);
Postordine (R.ArboreDrept)
Prelucrare (R.Info);
Sfarsit Daca
Sfarsit Preordine;
Pentru arborele alturat, ordinea nodurilor corespunztoare cele trei tipuri de traversri este urmtoarea :
//adresa nod
//indicator cu valori 0 si 1
void arb::postordine()
//parcurgerea nerecursiva in
{ nod* p;
//postordine folosind o stiva in
el x;
//care sunt memorate elemente
STIVA<el> stiva(50);
//de tipul el
if(!rad) { cout<<" Arbore vid"; return;}
p=rad;
while(p || stiva.nevida())
{ while(p)
{ x.p=p;x.k=0;
stiva.push(x);
p=p->st;
}
stiva.pop(x);
p=x.p;
if(x.k==0)
//nu s-a parcurs inca subarborele drept
//al nodului cu adresa p;
{ x.k=1;
//se trece la parcurgerea subarborelui
//drept al nodului cu adresa p
stiva.push(x);
p=p->dr;
}
else
{cout<<p->info;p=NULL;}
}
}
void arb::nivele()
{ nod* p;
}
void arb::preord_rec()
{ preord_rec(rad);}
void arb::postord_rec(nod* p)
{ if(p==NULL) return;
postord_rec(p->st);
postord_rec(p->dr);
cout<<p->info;
//parcurgere recursiva
//arbore binar in
//postordine
}
int arb::caut(char x)
//se foloseste parcurgerea in
{ nod* p;
//preordine nerecursiva pentru
STIVA<nod*> stiva(50);
//cautarea nodului cu informatia
if(!rad) return 0;
//x, returneaza 1 la gasire si
stiva.push(rad);
//0 in caz contrar
while(stiva.nevida())
{stiva.pop(p);
if(p->info==x) return 1;
if(p->dr) stiva.push(p->dr);
if(p->st) stiva.push(p->st);
}
return 0;
}
int arb::egal(arb& a) //functia de interfata pentru
//verificarea egalitatii a doi arbori
//binari
{return egal(rad,a.rad);}
//returneaza valoarea 1 daca subarborii cu
//adresele p1 si p2 sunt egali si 0 in
//caz contrar
int arb::egal(nod* p1,nod *p2)
{ if(!p1 && !p2) return 1;
//cei doi subarbori sunt nuli
if( p1 && p2 && (p1->info==p2->info) &&
egal(p1->st,p2->st) && egal(p1->dr,p2->dr)) return 1;
return 0;
}
arb::arb(arb& a)
//constructorul de copiere care apeleaza
{rad=copiere(a.rad);//o functie recursiva care realizeaza
}
//copierea efectiva
nod* arb::copiere(nod* p1) //copiaza arborele cu adresa p1
{ nod* p2;
//intr-un arbore cu adresa p2
if(!p1) return NULL;
//si returneaza p2
p2=new nod(p1->info);
p2->st=copiere(p1->st);
p2->dr=copiere(p1->dr);
return p2;
}
arb::~arb() //destructorul care apeleaza o functie
{elib(rad);} //recursiva pentru dealocarea zonei de memorie
//alocate arborelui
void arb::elib(nod* p)
{ if(p==NULL) return;
elib(p->st);
elib(p->dr);
delete p;
}
arb1.crenivele();
cout<<"\n Parcurgere nerecursiva in inordine:\n";
arb1.inordine();
cout<<"\n Parcurgere nerecursiva in preordine:\n";
arb1.preordine();
cout<<"\n Parcurgere nerecursiva in postordine:\n";
arb1.postordine();
cout<<"\n Parcurgere pe nivele:\n";
arb1.nivele();
cout<<"\n\n Dati informatia de cautat in arbore:";
cin>>c;
if(arb1.caut(c))
cout<<"\nNodul cu informatia "<<c<<" exista in arbore";
else
cout<<"\nNodul cu informatia "<<c<<" nu exista in arbore";
arb arb1c(arb1);
cout<<"\n\n S-a copiat arborele binar creat in alt arbore
si se verica egalitatea lor";
if(arb1.egal(arb1c))
cout<<"\n Cei doi arbori sunt egali";
else
cout<<"\n Cei doi arbori sunt diferiti";
cout<< "\n\n Creare arbore binar in preordine \n";
arb2.crepreord();
cout<<"\n Parcurgere recursiva in inordine:\n";
arb2.inord_rec();
cout<<"\n Parcurgere recursiva in preordine:\n";
arb2.preord_rec();
cout<<"\n Parcurgere recursiva in postordine:\n";
arb2.postord_rec();
cout<<"\n\n Se verifica egalitate arbore creat pe nivele cu
cel creat in preordine";
if(arb1.egal(arb2))
cout<<"\n Cei doi arbori sunt egali";
else
cout<<"\n Cei doi arbori sunt diferiti";
}
Rezultate:
... TAD - ARBORE BINAR - informatia din noduri un caracter...
Creare arbore binar pe nivele
Dati radacina : A
Dati fiul stang ($ pentru NULL) al
Dati fiul drept ($ pentru NULL) al
Dati fiul stang ($ pentru NULL) al
Dati fiul drept ($ pentru NULL) al
Dati fiul stang ($ pentru NULL) al
Dati fiul drept ($ pentru NULL) al
Dati fiul stang ($ pentru NULL) al
Dati fiul drept ($ pentru NULL) al
Dati fiul stang ($ pentru NULL) al
Dati fiul drept ($ pentru NULL) al
Dati fiul stang ($ pentru NULL) al
Dati fiul drept ($ pentru NULL) al
lui
lui
lui
lui
lui
lui
lui
lui
lui
lui
lui
lui
A
A
B
B
C
C
D
D
E
E
F
F
:
:
:
:
:
:
:
:
:
:
:
:
B
C
D
$
E
F
$
$
$
$
$
$
Parcurgere
Parcurgere
Parcurgere
Parcurgere
nerecursiva in inordine:DBAECF
nerecursiva in preordine:ABDCEF
nerecursiva in postordine:DBEFCA
pe nivele:ABCDEF
radacina:A
fiul stang
fiul stang
fiul stang
fiul drept
fiul drept
fiul drept
fiul stang
fiul stang
fiul drept
fiul drept
fiul stang
fiul drept
($
($
($
($
($
($
($
($
($
($
($
($
pentru
pentru
pentru
pentru
pentru
pentru
pentru
pentru
pentru
pentru
pentru
pentru
NULL)
NULL)
NULL)
NULL)
NULL)
NULL)
NULL)
NULL)
NULL)
NULL)
NULL)
NULL)
al
al
al
al
al
al
al
al
al
al
al
al
lui
lui
lui
lui
lui
lui
lui
lui
lui
lui
lui
lui
A:
B:
D:
D:
B:
A:
C:
E:
E:
C:
F:
F:
B
D
$
$
$
C
E
$
$
F
$
$