C/Visual C - Ayuda con este programa de Arbol

 
Vista:

Ayuda con este programa de Arbol

Publicado por Enrique (2 intervenciones) el 28/02/2019 16:10:31
Hola, por favor necesito ayuda, necesito agregar que el programa deje ingresar al usuario los datos para el arbol y que cumpla con esto:
Cada nodo sólo almacena un carácter (char)
El criterio para ordenar los caracteres es el código ascii de cada uno
El usuario ingresa los valores, colocar un menú con esta opción
Agregar una función de búsqueda que reciba como parámetro un caracter e indique si éste se encuentra o no en el árbol, colocar un menú con esta opción

Tengo un programa bastante avanzado, sin embargo creo que faltaria la opcion de que el usuario ingrese los datos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
 
#define	VERDADERO 	1;
#define	FALSO 		0;
 
struct NodoArbol{
	NodoArbol *Izq;
   NodoArbol *Der;
   int  Info;
};
 
NodoArbol *CreaNodo(int);
void InsertaNodo(NodoArbol **, NodoArbol *);
int EliminaNodo(NodoArbol **, NodoArbol **, int);
int BuscaNodo(NodoArbol **Raiz, NodoArbol **Nodo, NodoArbol **Anterior, int numero);
NodoArbol *MuestraArbolInorden(NodoArbol *);
NodoArbol *MuestraArbolPreorden(NodoArbol *);
NodoArbol *MuestraArbolPostorden(NodoArbol *);
void EliminaArbol( NodoArbol **);
int Menu();
 
NodoArbol *CreaNodo(int valor){
	NodoArbol *Nodo=NULL;
   if ((Nodo = (NodoArbol *)malloc(sizeof(NodoArbol)))==0)
        return NULL;
   else {
   	Nodo->Info = valor;
   	Nodo->Izq = NULL;
   	Nodo->Der = NULL;
   	return Nodo;
   }
}
 
void InsertaNodo(NodoArbol **Raiz, NodoArbol *Nodo){
   if(*Raiz==NULL){
   	*Raiz = Nodo;
   }else{
   	if((*Raiz)->Info > Nodo->Info)
      	InsertaNodo(&(*Raiz)->Izq, Nodo);
   	else{
      	if((*Raiz)->Info < Nodo->Info)
      		InsertaNodo(&(*Raiz)->Der, Nodo);
      }
   }
}
 
int BuscaNodo(NodoArbol **Raiz, NodoArbol **Nodo, NodoArbol **Anterior, int numero){
	NodoArbol *Aux=NULL;
   Aux=*Raiz;
   while(Aux!=NULL){
   	if(Aux->Info == numero){
      	*Nodo = Aux;
      	return VERDADERO;
      }
      *Anterior = Aux;
      if(Aux->Info < numero)
      	Aux = Aux->Der;
      else
      	Aux = Aux->Izq;
   }
   return FALSO;
}
 
int EliminaNodo(NodoArbol **Raiz, NodoArbol **Nodo, int numero){
	NodoArbol *Anterior, *AuxAnt, *Aux;
 
   if(*Raiz==NULL){
   	printf("Arbol no existe");
      return 0;
   }
   if(!BuscaNodo(&(*Raiz), &(*Nodo), &Anterior, numero)){
   	printf("Nodo no existe");
      return 0;
   }
   //Nodo Hoja
   if(((*Nodo)->Izq == NULL)&&((*Nodo)->Der == NULL)){
   	if (Anterior->Der == *Nodo)
      	Anterior->Der = NULL;
      else
      	Anterior->Izq = NULL;
   }
   //Nodo solo tiene una hoja izq
   if(((*Nodo)->Izq != NULL)&&((*Nodo)->Der == NULL)){
   	if (Anterior->Izq == *Nodo)
      	Anterior->Izq = (*Nodo)->Izq;
      else
      	Anterior->Der = (*Nodo)->Izq;
   }
   //Nodo solo tiene una hoja der
   if(((*Nodo)->Izq == NULL)&&((*Nodo)->Der != NULL)){
   	if (Anterior->Der == *Nodo)
      	Anterior->Der = (*Nodo)->Der;
      else
      	Anterior->Izq = (*Nodo)->Der;
   }
   //Nodo tiene dos hijos
   if(((*Nodo)->Izq != NULL)&&((*Nodo)->Der != NULL)){
   	Aux=(*Nodo)->Izq;
      AuxAnt=Aux;
      while(Aux->Der!=NULL){
        	AuxAnt=Aux;
         Aux=Aux->Der;
      }
      (*Nodo)->Info=Aux->Info;
      AuxAnt->Der=Aux->Izq;
      if(Anterior ==NULL)
      	Raiz=Nodo;
   }
}
 
NodoArbol *MuestraArbolInorden(NodoArbol *Raiz){
	if(Raiz==NULL){
   	return NULL;
   }
   else{
   	MuestraArbolInorden(Raiz->Izq);
      printf("%d ", Raiz->Info);
      MuestraArbolInorden(Raiz->Der);
   }
}
 
NodoArbol *MuestraArbolPreorden(NodoArbol *Raiz){
	if(Raiz==NULL){
   	return NULL;
   }
   else{
   	printf("%d ", Raiz->Info);
   	MuestraArbolPreorden(Raiz->Izq);
      MuestraArbolPreorden(Raiz->Der);
   }
}
 
NodoArbol *MuestraArbolPostorden(NodoArbol *Raiz){
	if(Raiz==NULL){
   	return NULL;
   }
   else{
   	MuestraArbolPostorden(Raiz->Izq);
      MuestraArbolPostorden(Raiz->Der);
      printf("%d ", Raiz->Info);
   }
}
 
void EliminaArbol( NodoArbol **Raiz ){
   if (*Raiz != NULL) {
      EliminaArbol(&(*Raiz)->Izq);
      EliminaArbol(&(*Raiz)->Der);
      *Raiz=NULL;
   }
}
 
int Menu(){
	int Opcion;
   //clrscr();
   printf("\n\n");
   printf("1 - Insertar Nodo \n");
   printf("2 - Eliminar Nodo \n");
   printf("3 - Mostrar Arbol \n");
   printf("4 - Eliminar Arbol \n");
   printf("0 - Salir \n");
 
	printf("Ingrese Opcion: ");
   scanf("%d",&Opcion);
   return Opcion;
}
 
void main(){
   NodoArbol *Raiz=NULL,*Nodo=NULL;
   int numero, Opcion;
 
   do{
   	Opcion = Menu();
      switch(Opcion){
       	case 0: 	break;
         case 1:  printf("Ingrese valor: ");
   					scanf("%d", &numero);
   					Nodo = CreaNodo(numero);
   					InsertaNodo(&Raiz, Nodo);
                  break;
         case 2:  printf("Ingrese valor: ");
   					scanf("%d", &numero);
         			EliminaNodo(&Raiz,&Nodo,numero);
                  break;
         case 3:  if (Raiz == NULL)
         				printf("\nEl arbol esta vacio ...\n");
         			else{
                  		printf("Arbol: \n\n\n");
								printf("Notacion Preorden: \n");
								*MuestraArbolPreorden(Raiz);
 
								printf("\nNotacion Inorden: \n");
								*MuestraArbolInorden(Raiz);
 
   							printf("\nNotacion Postorden: \n");
								*MuestraArbolPostorden(Raiz);
                  }
                  getch();
                  break;
         case 4:  EliminaArbol(&Raiz );
                  break;
         default: printf("Opción Inválida: \n");
         			break;
      }
   }while(Opcion != 0);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder