Arboles binarios en C++
Les dejo un viejo apunte de la universidad
Para descargar de clic en descargar
ARBOLES.CPP
1: #include <stdio.h>
2: #include <iostream.h>
3: #include <conio.h>
4: #include <stdlib.h>
5: 6: typedef int tipodatoarbol;
7: typedef struct nodo {
8: tipodatoarbol dato;9: struct nodo *izq;
10: struct nodo *der;
11: } tipoNodo;12: typedef tipoNodo *pNodo;
13: 14: void insertar(pNodo *l,tipodatoarbol Dato);
15: void inicializar(pNodo *l);
16: void eliminar(pNodo *l, tipodatoarbol d);
17: void preorden(pNodo *l);
18: void inorden(pNodo *l);
19: void postorden(pNodo *l);
20: void menu(pNodo *l);
21: void inicio(pNodo *l);
22: void agregar(pNodo *l);
23: void quitar(pNodo *l);
24: 25: void main()
26: { 27: pNodo arbol; 28: menu(&arbol); 29: } 30: 31: void menu(pNodo *l)
32: { int op;
33: clrscr();34: gotoxy(33,7);cout<<"ARBOL BINARIO";
35: gotoxy(32,9);cout<<"1) Inicializar";
36: gotoxy(32,11);cout<<"2) Insertar";
37: gotoxy(32,13);cout<<"3) Eliminar";
38: gotoxy(32,15);cout<<"4) Imprimir";
39: gotoxy(32,17);cout<<"5) Salir";
40: do{
41: gotoxy(33,19);cout<<"Opcion [ ] ";
42: gotoxy(41,19);cin>>op;43: }while (op>5 || op<1);
44: 45: switch(op)
46: {47: case 1:
48: inicio(l);49: break;
50: case 2:
51: agregar(l);52: break;
53: case 3:
54: quitar(l);55: break;
56: case 4:
57: clrscr();58: gotoxy(10,16);cout<<" Inorden: ";inorden(l);
59: gotoxy(10,17);cout<<" Preorden: ";preorden(l);
60: gotoxy(10,18);cout<<" Postorden: ";postorden(l);
61: getch(); 62: menu(l);63: break;
64: case 5:
65: exit(0); 66: } 67: getch(); 68: } 69: 70: void inicio(pNodo *l)
71: { clrscr(); 72: inicializar(l); 73: menu(l); 74: } 75: 76: void agregar(pNodo *l)
77: { clrscr();78: int D;
79: //char opc='s';
80: gotoxy(30,20);cout<<"Insertar numero: "; cin>>D;
81: insertar(l,D);82: // cout<<"Desea Insertar otro dato (S/N): "; cin>>opc;
83: // }while(opc=='s' ||opc=='S');
84: menu(l); 85: }86: void quitar(pNodo *l)
87: { clrscr();88: int D;
89: //char opc='s';
90: //do{
91: gotoxy(30,20);cout<<"Numero a eliminar: "; cin>>D;
92: eliminar(l,D);93: //gotoxy(12,8);cprintf("\nDesea Eliminar otro dato (S/N): "); cin>>opc;
94: //}while(opc=='s' ||opc=='S');
95: menu(l); 96: } 97: 98: // FUNCIONES BASICAS
99: void inicializar(pNodo *l)
100: { 101: *l=NULL; 102: } 103: 104: //insertar
105: void insertar(pNodo *l,tipodatoarbol Dato){
106: pNodo Nuevo, Aux;107: int b;
108: Nuevo=(pNodo)malloc(sizeof(tipoNodo));
109: Nuevo->dato= Dato; 110: Nuevo->der=NULL; 111: Nuevo->izq=NULL; 112: Aux=*l;113: if (*l==NULL){
114: *l=Nuevo; 115: }116: else if (*l!=NULL)
117: { 118: b=0;119: while(b==0)
120: {121: if(Nuevo->dato<=Aux->dato)
122: {123: while(Aux->izq!=NULL&&Nuevo->dato<=Aux->dato)
124: { Aux=Aux->izq;}125: if(Nuevo->dato<=Aux->dato&&Aux->izq==NULL)
126: {Aux->izq=Nuevo; 127: b=1; 128: }129: else {if(Nuevo->dato>Aux->dato&&Aux->der==NULL)
130: {Aux->der=Nuevo; 131: b=1; 132: } } 133: }134: else
135: if(Nuevo->dato>Aux->dato)
136: { 137: 138: while(Aux->der!=NULL&&Nuevo->dato>Aux->dato)
139: { Aux=Aux->der;}140: if(Nuevo->dato<=Aux->dato&&Aux->izq==NULL)
141: {Aux->izq=Nuevo; 142: b=1; 143: }144: else if(Nuevo->dato>Aux->dato&&Aux->der==NULL)
145: {Aux->der=Nuevo; 146: b=1; 147: } 148: } } 149: } 150: 151: } 152: 153: void eliminar(pNodo *l,tipodatoarbol d)
154: {155: if(*l==NULL)
156: {157: gotoxy(30,20);cout<<"Arbol vacio";
158: getch(); 159: }160: else
161: { 162: pNodo aux,ant; 163: aux=*l;164: while(aux->dato!=d&&(aux->izq!=NULL||aux->der!=NULL))
165: {166: if(d<=aux->dato)
167: { 168: ant=aux; 169: aux=aux->izq; 170: }171: else
172: { 173: ant=aux; 174: aux=aux->der; 175: } 176: }177: if(aux->dato==d)
178: {179: if(aux==*l&&aux->izq==NULL&&aux->der==NULL)
180: { 181: inicializar(l); 182: }183: else
184: {185: if(aux->izq!=NULL&&aux->der!=NULL)
186: { 187: ant=aux; 188: aux=aux->izq;189: if(aux->der==NULL)
190: { 191: ant->dato=aux->dato; 192: ant->izq=aux->izq; 193: }194: else
195: { 196: pNodo ant2;197: while(aux->der!=NULL)
198: { 199: ant2=aux; 200: aux=aux->der; 201: } 202: ant->dato=aux->dato;203: if(aux->izq==NULL)
204: { 205: ant2->der=NULL; 206: }207: else
208: { 209: ant2->der=aux->izq; 210: } 211: } 212: free(aux); 213: }214: else
215: if(aux->izq!=NULL||aux->der!=NULL)
216: {217: if(aux->izq!=NULL)
218: {219: if(aux->dato<=ant->dato)
220: {221: if(aux==*l)
222: *l=aux->izq;223: else
224: ant->izq=aux->izq; 225: }226: else
227: {228: if(aux==*l)
229: *l=aux->izq;230: else
231: ant->der=aux->izq; 232: } 233: }234: else
235: {236: if(aux->dato<=ant->dato)
237: {238: if(aux==*l)
239: *l=aux->der;240: else
241: ant->izq=aux->der; 242: }243: else
244: {245: if(aux==*l)
246: *l=aux->der;247: else
248: ant->der=aux->der; 249: } 250: } 251: free(aux); 252: }253: else
254: if(aux->izq==NULL&&aux->der==NULL)
255: {256: if (aux->dato<=ant->dato)
257: ant->izq=NULL;258: else
259: ant->der=NULL; 260: free(aux); 261: } 262: } 263: }264: else
265: {266: gotoxy(30,20);cout<<"Numero no existente";
267: getch(); 268: } 269: } 270: }271: void preorden(pNodo *l){
272: pNodo Aux,*l2; 273: Aux=*l;274: if(*l!=NULL){
275: cout<<" "<<Aux->dato;
276: *l2=Aux->izq; 277: preorden(l2); 278: *l2=Aux->der; 279: preorden(l2); 280: } 281: } 282: 283: 284: void inorden(pNodo *l){
285: pNodo Aux,*l2; 286: Aux=*l;287: if(*l!=NULL){
288: *l2=Aux->izq; 289: inorden(l2);290: cout<<" "<<Aux->dato;
291: *l2=Aux->der; 292: inorden(l2); 293: } 294: } 295: 296: void postorden(pNodo *l){
297: pNodo Aux,*l2; 298: Aux=*l;299: if(*l!=NULL){
300: *l2=Aux->izq; 301: postorden(l2); 302: *l2=Aux->der; 303: postorden(l2);304: cout<<" "<<Aux->dato;
305: } 306: } 307: 

Comentarios
Publicar un comentario