Arbori binari
In cazul in care o arborescenta are pentru fiecare varf cel mult doi descendenti, unul stang si unul drept, spunem ca avem un arbore binar. (prin abuz de limbaj, vom folosi termenul de arbore in loc de arborescenta).
Figura 1
In figura 1 este reprezentat un arbore binar in care radacina este 1 (s-a renuntat la orientarea arcelor, care sunt implicite deoarece se cunoaste radacina).
Observatii:
· Nodurile sunt asezate pe mai multe niveluri
· Radacina este pe nivelul 0
· Adancimea arborelui este egala cu numarul de niveluri-1. Arborele din figura 1 are 4 niveluri: nivel 0, nivel 1, nivel 2, nivel 3 si adancimea 3
· Se face distinctie intre descendentul stang si cel drept
Urmatorii doi arbori sunt distincti:
Modalitati de reprezentare a arborilor binari
1. Modalitati specifice grafurilor:
Fiind cazuri particulare de grafuri arborii binari se pot reprezenta ca si acestia prin:
2. Modalitati specifice arborilor:
Pentru arborele din figura 1 cei doi vectori retin:
Vectorul stang:
2 |
4 |
6 |
0 |
0 |
0 |
0 |
0 |
Vectorul drept:
3 |
5 |
7 |
0 |
0 |
0 |
8 |
0 |
Utilizeaza alocarea dinamica a memoriei. Fiecare nod este reprezentat in HEAP ca o inregistrare care va retine numarul de ordine al nodului si adresele nodurilor subordonate stang si drept:
Struct nod{int nro;
nod* st, *dr;}
Generarea unui arbore binar utilizand HEAP-ul utilizeaza tehnica Divide et Impera. Vom defini un subprogram recursiv care intoarce adresa nodului curent. Pentru nodurile terminale se va citi 0 pentru subordonatii stang si drept sau numai un 0 daca lipseste unul dintre subordonatii unui nod. Subprogramul se autoapeleaza pentru fiecare dintre cei doi subordonati ai unui nod si intoarce adresa nodului curent. Pentru prelucrarea unui arbore binar este suficient sa se cunoasca adresa radacinii.
Pentru arborele din figura alaturata se vor introduce datela in urmatoarea ordine: 1 2 4 0 0 5 0 0 3 6 0 0 7 0 8 0 0 |
|
#include<iostream.h>
struct nod{int nro;
nod*st,*dr;};
nod *r;
nod* citire_h()
{int nr;
nod*c;
cout<<"nr de ordine ";
cin>>nr;
if(nr)
{c=new nod;
c->nro=nr;
c->st=citire_h();
c->dr=citire_h();
return c;
}
else
return 0;
}
void main()
{
r=citire_h();
}
Memorare statica. Probleme propuse:
Ex pt n=8 se va genera: