Pagini recente » Istoria paginii runda/iiot45/clasament | Cod sursa (job #1917687) | Cod sursa (job #600161) | Cod sursa (job #945127) | Cod sursa (job #2199160)
/**-- test-ab.c -- prelucreaza arbori binari cu chei intregi --*/
#include "tarb.h"
/*-- se completeaza cu definitiile functiilor implementate --*/
void RSD(TArb a)
{
if(!a) {printf("-"); return;}
if(!a->st && !a->dr) {printf(" %d ", a->info); return;}
printf(" %d ", a->info);
printf("(");
RSD(a->st);
printf(",");
RSD(a->dr);
printf(")");
}
int Numara(TArb a)
{
int sum=0;
if(!a)
return 0;
if(a->st) sum+=a->st->info;
if(a->dr) sum+=a->dr->info;
if(a->info>sum && (a->dr||a->st) )
return 1+Numara(a->st)+Numara(a->dr);
else return Numara(a->st)+Numara(a->dr);
}
void Cerinta_2(TArb a)
{
if (a == NULL)
printf("Problema");
if (a->st == NULL)
printf("\nNu exista o astfel de valoare");
else
{ a = a->st;
while (a->dr != NULL)
a = a->dr;
printf("%d\n", a->info);
}
}
int NrNiv1(TArb r) /* numar niveluri (0 pentru arbore vid) */
{
int ns, nd;
if (!r) return 0;
ns = NrNiv1(r->st); nd = NrNiv1(r->dr);
if (ns == -123456 || nd == -123456)
return -123456;
if (ns - nd > 1 || nd - ns > 1)
return -123456;
return 1 + (ns >= nd ? ns : nd);
}
int NrNiv2(TArb r) /* numar niveluri (0 pentru arbore vid) */
{
int ns, nd;
if (!r) return 0;
ns = NrNiv2(r->st); nd = NrNiv2(r->dr);
if (ns == -123456 || nd == -123456)
return -123456;
if (r->st != NULL)
if (r->info % 2 == 1 && r->st->info % 2 == 1)
return -123456;
if (r->dr != NULL)
if (r->info % 2 == 1 && r->dr->info % 2 == 1)
return -123456;
return 1 + (ns >= nd ? ns : nd);
}
int ParcurgeSRD(TArb a)
{
if(!a) return 0;
int rez=0;
rez=ParcurgeSRD(a->st);
if( !(a->info%2) && (a->st||a->dr) && !(a->st&&a->dr))
{
printf("%d \n",a->info);
rez+=1;
}
return rez+ParcurgeSRD(a->dr);
}
TArb CitABC()
{
TArb a=NULL, aux;
int el;
while(scanf("%d",&el)==1)
{
if(!a)
a=ConstrFr(el);
else
{
aux=a;
while(1)
{
if(el<aux->info && aux->st)
aux=aux->st;
else if(el<aux->info && !aux->st)
{
aux->st=ConstrFr(el);
break;
}
else if(el>aux->info &&aux->dr)
aux=aux->dr;
else if(el>aux->info &&!aux->dr)
{
aux->dr=ConstrFr(el);
break;
}
else
break;
}
}
}
return a;
}
int main ()
{
TArb arb;
randomize();
do {
// arb = ConstrAA (5, random(16), -50, 50);
arb=CitABC();
AfiArb (arb);
printf("nr=%d\n",Numara(arb));
printf ("noduri: %i niveluri: %i\n",
NrNoduri(arb), NrNiv(arb));
RSD(arb);
ParcurgeSRD(arb);
/*-- se completeaza cu apelurile functiilor implementate --*/
printf("\nCea mai apropiata valoarea de radacina si mai mica decat radacina este ");
Cerinta_2(arb);
if (NrNiv1(arb) == -12345)
printf("Nu este echilibrat");
else
printf("Este echilibrat");
printf("\n%d", NrNiv2(arb));
DistrArb (&arb);
printf ("\nInca un arbore ? [D/N] ");
if (getchar() == 'n') break;
printf("\n");
} while (1);
return 0;
}