Sunteți pe pagina 1din 4

#include <stdio.

h>
#include <stdlib.h>
typedef struct nod
{
int nr;
struct nod *st,*dr;
}NOD;
NOD *rad;
//creare nerecursiva
void creare(int key)
{
NOD *p,*q;
p=malloc(sizeof(NOD));
p->nr=key;
p->st=0;
p->dr=0;
if(rad==0)
{
rad=p;
return;
}
q=rad;
for(;;)
{
if(key<q->nr)
{
if(q->st==0)
{
q->st=p;
return;
}
else q=q->st;
}
else if (key>p->nr)
{
if(q->dr==0)
{
q->dr=p;
return;
}
else q=q->dr;
}
else
{
free(p);
return;
}
}
}
//inserare recursiva
NOD *inserare_rec(NOD *rad, int key)
{
NOD *p;
if(rad==0)
{
p=malloc(sizeof(NOD));
p->nr=key;
p->dr=0;
p->st=0;
return p;
}
else
{
if(key<rad->nr)
rad->st=inserare_rec(rad->st,key);
else
if(key>rad->nr)
rad->dr=inserare_rec(rad->dr,key);
}
return rad;
}
//functie de afisare in inordine sau crescator
void inordine(NOD *p, int nivel)
{
int i;
if(p!=0)
{
inordine(p->st, nivel+1);
printf("%d\n", p->nr);
inordine(p->dr, nivel+1);
}
}
//afisare descrescatoare a unui arbore
void descr(NOD *p, int nivel)
{
int i;
if(p!=0)
{
inordine(p->dr, nivel+1);
printf("%s\n", p->key);
inordine(p->st, nivel+1);
}
}
//functie de afisare in preordine
void preordine(NOD *p, int nivel)
{
int i;
if(p!=0)
{
printf("%d\n", p->nr);
preordine(p->st, nivel+1);
preordine(p->dr, nivel+1);
}
}
//functie de afisare in postordine
void postordine(NOD *p, int nivel)
{
int i;
if(p!=0)
{
postordine(p->st, nivel+1);
postordine(p->dr, nivel+1);
printf("%d\n", p->nr);
}
}
//functie de cautare
NOD *cautare(NOD *rad, int key)
{
NOD *p;
if(rad==0) return 0;
p=rad;
while(p!=0)
{
if(p->nr==key) return p;
else if(key<p->nr) p=p->st;
else p=p->dr;
}
return 0;
}
//functie de stergere
NOD *stergere(NOD *rad, int key)
{
NOD *p,*tata_p;
NOD *nod_inlocuire,*tata_nod_inlocuire;
int directie; //1=st; 2=dr
if(rad==0) return 0;
p=rad;
tata_p=0;
while((p!=0)&& (p->nr!=key))
{
if(key<p->nr)
{
tata_p=p;
p=p->st;
directie=1;
}
else
{
tata_p=p;
p=p->dr;
directie=2;
}
}
if(p==0)
{
printf("nu exista nod cu cheia=%d", key);
return rad;
}
if (p->st==0) nod_inlocuire=p->dr;
else if (p->dr==0) nod_inlocuire=p->st;
else{tata_nod_inlocuire=p;
nod_inlocuire=p->dr;
while (nod_inlocuire->st!=0)
{
tata_nod_inlocuire=nod_inlocuire;
nod_inlocuire=nod_inlocuire->st;
}
if(tata_nod_inlocuire!=p)
{
tata_nod_inlocuire->st=nod_inlocuire->dr;
nod_inlocuire->dr=p->dr;
}
nod_inlocuire->st=p->st;
free(p);
printf("Nodulde cheie %d a fost gasit si sters\n",key);
if (tata_p==0)return nod_inlocuire;
else{if (directie==1) tata_p->st=nod_inlocuire;
else tata_p->dr=nod_inlocuire;
return rad;
}
}
}
int main()
{
NOD *p;
int i,n,key;
printf("numar de noduri: ");
scanf("%d", &n);
rad=0;
printf("introduceti numerele: ");
for(i=1;i<=n;i++)
{
scanf("%d", &key);
rad=inserare_rec(rad,key);
}
printf("afisare in inordine: \n");
inordine(rad,0);
printf("afisare in preordine: \n");
preordine(rad, 0);
printf("afisare in postordine: \n");
postordine(rad, 0);
printf("introduceti elementul cautat: ");
scanf("%d", &key);
p=cautare(rad,key);
if(p==0) printf("nodul nu exista\n");
else printf("nodul exista\n");
printf("introduceti elementul ce trebuie sters: ");
scanf("%d", &key);
rad=stergere(rad,key);
printf("Inordine:\n");
inordine(rad,0);
printf("Preordine:\n");
preordine(rad,0);
return 0;
}

S-ar putea să vă placă și