b tree ejemplo

5
/*Programa de Arboles Binarios. El programa realiza las siguientes operaciones: Insercion Busqueda Borrado Recorridos de un arbol (preorden,inorden,postorden) Arboles Binarios. Los arboles binarios son de los tipos particulares m s importantes de rboles con ra¡z. Cada vertice de un rbol binario tiene a lo m s dos hijos. Adem s cada hijo se designa como hijo izquierdo o hijo derecho. Recorridos de un arbol. Recorrer un arbol es recorrerlo de manera sistematica de modo que cada vertice sea visitado exactamente una vez. Los pasos para un recorrido en Preorden son: 1) Procesar el valor en el nodo 2) Recorrer el subarbol izquierdo 3) Recorrer el subarbol derecho Los pasos para un recorrido en Postorden son: 1) Recorrer el subarbol izquierdo 2) Recorrer el subarbol derecho 3) Procesar el valor en el nodo Los pasos para un recorrido en Inorden son: 1) Recorrer el subarbol izquierdo 2) Procesar el valor en el nodo 3) Recorrer el subarbol derecho */ #include <stdio.h> para printf(),scanf() y perror() #include <conio.h> para getch() y gotoxy() #include <alloc.h> para malloc() y free() #include <process.h> para system() y abort() #include <dos.h> para sleep() struct Arbol{ char Dato; struct Arbol *Izq; struct Arbol *Der; }; void Menu(void); void error(void); struct Arbol *Buscar(struct Arbol * ,char); struct Arbol *Borrar(struct Arbol * ,char); void InsertarNodo (struct Arbol **,char); void Imprime (struct Arbol *Raiz,int); void InOrden (struct Arbol *Raiz); void PostOrden(struct Arbol *Raiz); void PreOrden (struct Arbol *Raiz);

Upload: lucas-del-rio

Post on 14-Sep-2015

219 views

Category:

Documents


0 download

DESCRIPTION

Ejemplo de un árbol B en C

TRANSCRIPT

/*Programa de Arboles Binarios.

El programa realiza las siguientes operaciones: Insercion Busqueda Borrado Recorridos de un arbol (preorden,inorden,postorden)

Arboles Binarios. Los arboles binarios son de los tipos particulares m s importantes de rboles con raz. Cada vertice de un rbol binario tiene a lo m s dos hijos. Adem s cada hijo se designa como hijo izquierdo o hijo derecho.

Recorridos de un arbol. Recorrer un arbol es recorrerlo de manera sistematica de modo que cada vertice sea visitado exactamente una vez.

Los pasos para un recorrido en Preorden son: 1) Procesar el valor en el nodo 2) Recorrer el subarbol izquierdo 3) Recorrer el subarbol derecho

Los pasos para un recorrido en Postorden son: 1) Recorrer el subarbol izquierdo 2) Recorrer el subarbol derecho 3) Procesar el valor en el nodo

Los pasos para un recorrido en Inorden son: 1) Recorrer el subarbol izquierdo 2) Procesar el valor en el nodo 3) Recorrer el subarbol derecho

*/#include para printf(),scanf() y perror()#include para getch() y gotoxy()#include para malloc() y free()#include para system() y abort()#include para sleep()

struct Arbol{ char Dato; struct Arbol *Izq; struct Arbol *Der;};

void Menu(void);void error(void);struct Arbol *Buscar(struct Arbol * ,char);struct Arbol *Borrar(struct Arbol * ,char);void InsertarNodo (struct Arbol **,char);void Imprime (struct Arbol *Raiz,int);void InOrden (struct Arbol *Raiz);void PostOrden(struct Arbol *Raiz);void PreOrden (struct Arbol *Raiz);enum{insertar=1,buscar,imprime,inorden,postorden,preorden,salir};

int main(void){ char dato; int opcion; struct Arbol *Raiz=NULL; Menu(); scanf("%d",&opcion); while(opcion!=salir){ switch(opcion){ case insertar: printf("Introduce un caracter: "); scanf("\n%c",&dato); InsertarNodo(&Raiz,dato); break; case buscar: printf("Introduzca el caracter a buscar: "); scanf("\n%c",&dato); if(Buscar(Raiz,dato)) printf("Elemento encontrado.\n"); else printf("El elemento no se encontro en el arbol.\n"); getch(); break; case imprime: printf("El arbol es:\n"); Imprime(Raiz,0); getch(); break; case inorden: printf("En Inorden es:\n"); InOrden(Raiz); getch(); break; case postorden:printf("En Postorden es:\n"); PostOrden(Raiz); getch(); break; case preorden: printf("En preorden es:\n"); PreOrden(Raiz); getch(); break; default: gotoxy(32,22); printf("Opcion Incorrecta."); getch(); Menu(); break; } Menu(); scanf("%d",&opcion); } gotoxy(32,24); printf("Fin de %s",__FILE__); sleep(1); system("cls"); return 0;}

void error(void){ perror("error: no hay memoria suficiente."); getch(); abort();}

void PreOrden(struct Arbol *Raiz){ if(!Raiz) return; if(Raiz->Dato) printf("%c-> ",Raiz->Dato); PreOrden(Raiz->Izq); PreOrden(Raiz->Der);}

void PostOrden(struct Arbol *Raiz){ if(!Raiz) return; PostOrden(Raiz->Izq); PostOrden(Raiz->Der); if(Raiz->Dato) printf("%c-> ",Raiz->Dato);}

void InOrden(struct Arbol *Raiz){ if(!Raiz) return; InOrden(Raiz->Izq); if(Raiz->Dato) printf("%c-> ",Raiz->Dato); InOrden(Raiz->Der);}

void InsertarNodo(struct Arbol **Raiz,char valor){ if(*Raiz==NULL){ *Raiz=(struct Arbol *)malloc(sizeof(struct Arbol)); if(*Raiz!=NULL){ (*Raiz)->Dato=valor; (*Raiz)->Izq=NULL; (*Raiz)->Der=NULL; } else{ printf("%c no insertado.\n",valor); error(); } } else if(valorDato) InsertarNodo(&((*Raiz)->Izq),valor); else if(valor>(*Raiz)->Dato) InsertarNodo(&((*Raiz)->Der),valor); else printf("Dato duplicado.\n");}

void Imprime(struct Arbol *Raiz,int n){ int i;

if(Raiz!=NULL){ Imprime(Raiz->Der,n+1); for(i=0;iDato); Imprime(Raiz->Izq,n+1); }}

struct Arbol *Buscar(struct Arbol *Raiz,char clave){ if(!Raiz) return Raiz; while(Raiz->Dato!=clave){ if(claveDato) Raiz=Raiz->Izq; else Raiz=Raiz->Der; if(Raiz==NULL) break; } return Raiz;}

struct Arbol *Borrar(struct Arbol *Raiz,char clave){ struct Arbol *p,*p2; if(!Raiz){ printf("%c elemento no encontrado.\n",clave); return Raiz; } if(Raiz->Dato==clave){ if(Raiz->Izq==Raiz->Der){ free(Raiz); return NULL; } else if(Raiz->Izq==NULL){ p=Raiz->Der; free(Raiz); return p; } else if(Raiz->Der==NULL){ p=Raiz->Izq; free(Raiz); return p; } else{ p2=Raiz->Der; p=Raiz->Der; while(p->Izq) p=p->Izq; p->Izq=Raiz->Izq; free(Raiz); return p2; } } if(Raiz->Dato < clave) Raiz->Der=Borrar(Raiz->Der,clave); else Raiz->Izq=Borrar(Raiz->Izq,clave);

return Raiz;}

void Menu(void){ system("cls"); gotoxy(32,10); printf("Escoja su opcion:"); gotoxy(32,12); printf("1. Insertar."); gotoxy(32,13); printf("2. Buscar."); gotoxy(32,14); printf("3. Imprimir."); gotoxy(32,15); printf("4. Inorden."); gotoxy(32,16); printf("5. PostOrden."); gotoxy(32,17); printf("6. Preorden."); gotoxy(32,18); printf("7. Salir."); gotoxy(32,19); printf("-> ");}