Árboles Binarios (Programaa)

Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

ÁRBOLES BINARIOS -1-

/* ********** ARBOLES BINARIOS ********** */


/* ******* Nerio Villalobos Finol ******* */
/* ************************************** */

#include <stdio.h>
#include <conio.h>
#include <alloc.h>

#define M 25

typedef int Arreglo[M];

struct Arbol {
int Data;
struct Arbol *Hi, *Hd;
} *a, *b, *c;

Arreglo A;
int i, j;
char ch;

void Insertar(struct Arbol **T, int x);


void Eliminar(struct Arbol **T, int x);
void PreOrden(struct Arbol *T);
void InOrden(struct Arbol *T);
void PosOrden(struct Arbol *T);
void Imprimir(struct Arbol *T, int n);
void Construir(struct Arbol **T, Arreglo A, int Iz, int De);
int Igual(struct Arbol *A, struct Arbol *B);
struct Arbol *Copiar(struct Arbol *T);
void LeerArreglo();
void IngresarDatos();
void YaExiste(int x);
void NoExiste(int x);

main() {
clrscr();
printf("\n\n\t\tArboles Binarios de Búsqueda");
printf("\t\t============================");
LeerArreglo();
Construir(&a, A, 1, 10);

Nerio Villalobos Finol


ÁRBOLES BINARIOS -2-

PreOrden(a); printf("\n");
InOrden(a); printf("\n");
PosOrden(a); printf("\n\n\n");
Imprimir(a, 1);
getch();
clrscr();
IngresarDatos();
clrscr();
Imprimir(b, 1);
ch = getch();
c = Copiar(b);
Imprimir(c, 1);
getch();
if (Igual(b, c)) printf("\nSon iguales");
else printf("\nNo son iguales");
getch();
return 0;
}

void LeerArreglo() {
int i, j, k, l;

clrscr();
printf("\n\n\t\tCuántos datos desea ingresar (<25) ");
scanf("%d", &l);
for (i = 1; i <= l; i++) {
gotoxy(10, 3 + i);
printf("A[%d] = ", i);
scanf("%d", &A[i]);
}
for (i = 1; i <= l - 1; i++)
for (j = i + 1; j <= l; j++)
if (A[i] > A[j]) {
k = A[i];
A[i] = A[j];
A[j] = k;
}
}

void IngresarDatos() {
int n;

Nerio Villalobos Finol


ÁRBOLES BINARIOS -3-

char ch;

do {
clrscr();
printf("\t\tIngrese un número entero (0 = salir): ");
scanf("%d", &n);
Insertar (&b, n);
} while (n);
}

void Insertar(struct Arbol **T, int x) {

if ( !(*T) ) {
*T = (struct Arbol *) malloc(sizeof(struct Arbol));
(*T)->Data = x;
(*T)->Hi = NULL;
(*T)->Hd = NULL;
}
else if (x < (*T)->Data) Insertar(&(*T)->Hi, x);
else if (x > (*T)->Data) Insertar(&(*T)->Hd, x);
else YaExiste(x);
}

void Eliminar(struct Arbol **T, int x) {


struct Arbol *Q, *R;

if ( !(*T) ) NoExiste(x);
else if (x < (*T)->Data) Eliminar(&(*T)->Hi, x);
else if (x > (*T)->Data) Eliminar(&(*T)->Hd, x);
else {
Q = *T;
if (!Q->Hd)
*T = Q->Hi;
else if (!Q->Hi)
*T = Q->Hd;
else {
R = Q->Hd;
while (R->Hi) R = R->Hi;
R->Hi = Q->Hi;
}
*T = Q->Hd;

Nerio Villalobos Finol


ÁRBOLES BINARIOS -4-

free(Q);
}
}

void PreOrden(struct Arbol *T) {

if (T) {
printf("%d - ", T->Data);
PreOrden(T->Hi);
PreOrden(T->Hd);
}
}

void InOrden(struct Arbol *T) {

if (T) {
InOrden(T->Hi);
printf("%d - ", T->Data);
InOrden(T->Hd);
}
}

void PosOrden(struct Arbol *T) {

if (T) {
PosOrden(T->Hi);
PosOrden(T->Hd);
printf("%d - ", T->Data);
}
}

void Construir(struct Arbol **T, Arreglo A, int Iz, int De)


{
int Me;

if (Iz <= De) {


*T = (struct Arbol *)malloc(sizeof(struct Arbol));
Me = (Iz + De) / 2;
(*T)->Data = A[Me];
(*T)->Hi = (*T)->Hd = NULL;
Construir(&(*T)->Hi, A, Iz, Me - 1);

Nerio Villalobos Finol


ÁRBOLES BINARIOS -5-

Construir(&(*T)->Hd, A, Me + 1, De);
}
}

int Igual(struct Arbol *A, struct Arbol *B) {


int R;

R = 0;
if (!A && !B) R = 1;
else {
if (A && B)
if (A->Data == B->Data)
R = Igual(A->Hi, B->Hi);
if (R) R = Igual(A->Hd, B->Hd);
}
return R;
}

struct Arbol *Copiar(struct Arbol *T) {


struct Arbol *Q, *I, *D;

if (T) {
I = Copiar(T->Hi);
D = Copiar(T->Hd);
Q = (struct Arbol *)malloc(sizeof(struct Arbol));
Q->Hi = I;
Q->Hd = D;
Q->Data = T->Data;
} else Q = NULL;
return Q;
}

void Imprimir(struct Arbol *T, int n) {


int i;
if (T) {
Imprimir(T->Hd, n + 1);
for (i = 1; i <= n; i++) printf(" ");
printf("%d\n", T->Data);
Imprimir(T->Hi, n + 1);
}
}

Nerio Villalobos Finol


ÁRBOLES BINARIOS -6-

void YaExiste(int x) {

printf("\n\n\t\t%d ya existe en el arbol...!", x);


printf("\n\n\t\tPresione una tecla para continuar...");
getch();
}

void NoExiste(int x) {

printf("\n\n\t\t%d no existe en el arbol...!", x);


printf("\n\t\tPresione una tecla para continuar...");
getch();
}

Nerio Villalobos Finol

You might also like