Cod sursa(job #2199160)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 26 aprilie 2018 19:26:00
Problema Algoritmul lui Euclid extins Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.86 kb
/**-- 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;
}