Download Cap.14 - Árboles binarios y ordenados - Ejercicio 14.2

Document related concepts

Recorrido de árboles wikipedia , lookup

Transcript
Cap 14. Apartado 14.8, página 447-449
EJERCICIO 14.2
Con los registros de estudiantes formar un árbol binario de búsqueda, ordenado
respecto al campo clave número de matrícula. El programa debe de tener las opciones
de mostrar los registros ordenados y eliminar un registro dando el número de
matrícula.
Cada registro tiene sólo dos campos de información: nombre y nummat .Además
los campos de enlace con el subárbol izquierdo y derecho.
Las operaciones que se hace uso son insertar, eliminar, buscar y
visualizar el árbol. Los algoritmos de las tres primeras operaciones ya están descritos
anteriormente. La operación de visualizar consiste en recorrer en inorden el árbol,
cada vez que se visita el nodo raíz se escriben los datos del estudiante.
No se vuelve a escribir el código de las funciones, en las secciones previas pueden
consultarse. Si se escribe visualizar() que es una aplicación de recorrer en inorden el
árbol de búsqueda, este tipo de recorrido hace que se muestren por pantalla los registros.
#include
#include
#include
#include
<stdio.h>
<string.h>
<stdlib.h>
<conio.h>
struct nodo {
int nummat;
char nombre[30];
struct nodo *izdo, *dcho;
};
typedef struct nodo Nodo;
Nodo* crearNodo(int id, char* n);
Nodo* buscar (Nodo* p, int buscado);
void insertar (Nodo** raiz, int matricula, char* nombre);
void reemplazar(Nodo** act);
void eliminar (Nodo** raiz, int matricula);
void visualizar (Nodo* r);
void main()
{
int nm;
char nom[30];
Nodo* raiz = NULL;
/* Crea el árbol */
do{
printf("Numero de matricula(0 -> Fin): ");
scanf("%d%*c",&nm);
if (nm)
{
printf("Nombre: "); gets(nom);
insertar(&raiz,nm,nom);
}
}while (nm);
/* Opciones de escribir el árbol o borrar una registro */
clrscr();
do{
puts("
1. Mostrar el árbol\n");
puts("
2. Eliminar un registro\n");
puts("
3. Salir\n
");
do scanf("%d%*c", &nm); while(nm<1 || nm>3);
if (nm == 1) {
printf("\n\t Registros ordenados por número de
matrícula\n");
visualizar(raiz);
}
else if (nm == 2){
int cl;
printf("Clave: "); scanf("%d",&cl);
eliminar(&raiz,cl);
}
}while (nm != 3);
}
void visualizar (Nodo* r)
{
if (r)
{
visualizar(r -> izdo);
printf("Matricula %d \t %s \n",r->nummat,r->nombre);
visualizar(r -> dcho);
}
}