Dev - C++ - Arboles Binarios sin Recursividad en C

 
Vista:
Imágen de perfil de Ernesto
Val: 23
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Arboles Binarios sin Recursividad en C

Publicado por Ernesto (14 intervenciones) el 23/05/2019 21:51:09
Cuando tuve que hacer uno de estos ejercicios no recibí mucha ayuda.
Así que les dejo este problema con el código para que les pueda ayudar a los que lo necesiten.

1
2
3
4
5
6
7
8
9
# Definición de la Estructura:
#include<stdio.h>
#include<stdlib.h>
struct nodo {
 int info;
 struct nodo *izq;
 struct nodo *der;
};
struct nodo *raiz=NULL;

Ítem I.- 30 puntos
Se pide crear el árbol binario sin usar recursividad. El usuario determina la cantidad de nodos a agregar a la estructura y los valores que ingresa.
Mostrar el árbol. Recorrer el árbol con un método recursivo, determine Ud. el método.
Nota: El árbol no existe, la aplicación lo crea.

Ítem II.- 30 puntos
Sin usar recursividad. Aceptar un valor, buscarlo en el árbol.
- Si existe desplegar: Encontrado.
- Si no existe desplegar: No encontrado.

CÓDIGO

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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
/*
Crear un arbol sin recursividad.
recorro el arbol con el metodo que quiera
El arbol no existe, la aplicacion lo crea

Sin recursividad, buscar un valor X
en el arbol
Si existe: encontrado, Sino, No encontrado.


Mientras valor sea != 0, tomar valores para ingresar al arbol, 
DO WHILE, si existe, tire mensaje que existe y pregunte denuevo.
Se crea un nuevo nodo, raiz aux -> info = dato, el *nuevoabb->der = null y ->iz = null
Inicializando la raiz en NULL siempre
Para todo nuevo elemento:
nuevo->info = dato;
nuevo->izq = NULL;
nuevo->der = NULL;
El dezplazamiento se hace con un AUX.
De principio, aux_raiz->izq = NULL, aux_raiz->der = NULL. Hay que hacer que aux_raiz->izq = nuevo
De la foto ahora nuevo -> info = 12, pregamos si esto es < raiz_aux->info < nuevo->info.....
Aux_raiz = raiz_aux->izq;....
Hay que hacer un do while o tendriamos un if gigante. PUede tb considerarse con un ciclo verdadero... 
tener condiciones de si lo encontro, no lo inserta y si lo encontro
insertarlo y dejar los izq y der = NULL de ese nuevo dato.
Nuevo->info (12), se pregunta si es mayor a la raiz, ahi se ve si el punteor correspondiente 
es distinto de null, de serlo se desplaza al siguiente,
de no serlo, crea el nuevo dato y el izq de la raiz apuntando a ese dato.... 
preguntando por mayor y menor.
HAy 3 opciones al ingresar datos al arbol. Agrego el dato al arbol, me desplazo
 en el arbol der o izq hasta el punto en que se agrega o dato invalido

la funcion insertar usa punteros y devuelve punteros, son tipo puntero

nuevo dato

Se solicita con la funcion malloc.
Preguntar si el arbol exis,te porq lado nos vamos.
nuevo->info = dato (14);
nuevo->izq = NULL;
nuevo->der = NULL;
Ya tenemos el nuevo nodo, verificar si raiz != NULL, entonces existe, decimos Aux = raiz;,
si nuevo->info < aux->info (15), y aux->izq != NULL, y nos desplazamos
y se pregunta todo dneuevo.si nuevo->info < aux->info (13), y aux->der!=NULL, 
if true, desplazamos, else aux ->der = nuevo y queda enlazado.
*/
 
 
//typedef struct Nodo abb;
 
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
 
struct Nodo {
	int dato;
	Nodo *der;
	Nodo *izq;
};
struct Nodo *arbol=NULL;
 
void menu();
Nodo *crearNodo(int);
void insertarNodo(Nodo *&, int);
void insertarIretativo(int);
void mostrarArbol(Nodo *, int);
bool busqueda(Nodo *, int);
bool busquedaIterativo(Nodo *, int);
void preOrden(Nodo *);
void InOrden(Nodo *);
void PostOrden(Nodo *);
 
int main(){
	/*
	insertarNodo(arbol,8);// Insertar Recursivo
	insertarNodo(arbol,3);
	insertarNodo(arbol,10);
	insertarNodo(arbol,1);
	insertarNodo(arbol,6);
	insertarNodo(arbol,4);
	insertarNodo(arbol,7);
	insertarNodo(arbol,14);
	insertarNodo(arbol,13); */
	insertarIretativo(8);//Funcion Iterativa
	insertarIretativo(3);
	insertarIretativo(10);
	insertarIretativo(1);
	insertarIretativo(6);
	insertarIretativo(4);
	insertarIretativo(7);
	insertarIretativo(14);
	insertarIretativo(13);
	menu();
	//getch();
	return 0;
}
 
void menu(){
	int dato, opcion,contador=0;
	do{
		printf("\n\t MENU");
		printf("\n\t 1. Insertar Nuevo Nodo Iterativo");
		printf("\n\t 2. Mostrar Arbol Completo");
		printf("\n\t 3. Buscar Dato Iterativo");
		printf("\n\t 4. Recorrer en PreOrden");
		printf("\n\t 5. Recorrer en InOrden");
		printf("\n\t 6. Recorrer en PostOrden");
		printf("\n\t 7. Buscar Dato Recursivo");
		printf("\n\t 8. Insertar Nuevo Nodo Recursivo");
		printf("\n\t 9. Salir");
		printf("\n\t Opcion: ");
		scanf("%d",&opcion);
		switch(opcion){
			case 1:
			{
				printf("\n\t Digite Numero: ");
				scanf("%d",&dato);
				//insertarNodo(arbol,dato);//insertamos un nuevo nodo
				insertarIretativo(dato);
				printf("\n");
			//	system("pause");
				break;
			}
			case 2:
			{
				printf("\nMostrando Arbol Completo\n\n:");
				mostrarArbol(arbol,contador);
				printf("\n");
				system("pause");
				break;
			}
			case 3:{
				printf("\nDigite el elemento a buscar:");
				scanf("%d",&dato);
				//printf("%d",busquedaIterativo(arbol,dato));
				if(busquedaIterativo(arbol,dato) == true)
					printf("\nEl elemento %d ha sido encontrado en el arbol\n",dato);
				else
					printf("\nElemento no encontrado\n");
				break;
			}
			case 4:{
				printf("\nRecorrido en PreOrden.");
				preOrden(arbol);
				printf("\n");
				break;
			}
			case 5:{
				printf("\nRecorrer en InOrden");
				InOrden(arbol);
				printf("\n");
				break;
			}
			case 6:{
				printf("\nRecorrer en PostOrden");
				PostOrden(arbol);
				printf("\n");
				break;
			}
			case 7:{
				printf("\nDigite el elemento a buscar:");
				scanf("%d",&dato);
				if(busqueda(arbol,dato) == true)
					printf("\nEl elemento %d ha sido encontrado en el arbol\n",dato);
				else
					printf("\nElemento no encontrado\n");
				break;
			}
			case 8:
			{
				printf("\n\t Digite Numero: ");
				scanf("%d",&dato);
				insertarNodo(arbol,dato);//insertamos un nuevo nodo
				//insertarIretativo(dato);
				printf("\n");
			//	system("pause");	
				break;
			}
		}//fin switch
	}while(opcion != 9);//fin do while
}
 
Nodo *crearNodo(int n){
	Nodo *nuevo_nodo = new Nodo();
	nuevo_nodo->dato=n;
	nuevo_nodo->der=NULL;
	nuevo_nodo->izq=NULL;
 
	return nuevo_nodo;
}
 
void insertarNodo(Nodo *&arbol, int n){
	if(arbol==NULL){//arbol vacio
		Nodo *nuevo_nodo = crearNodo(n);
		arbol = nuevo_nodo;//Nodo raiz
	}
	else{//el arbol ya tiene un nodo o mas
		if(busqueda(arbol,n)==false){
			int valorRaiz = arbol->dato; //obtenemos el valor de la raiz
			if(n<valorRaiz){//va al lado izquierdo pues es menor a la raiz
				insertarNodo(arbol->izq,n);//reemplazar esto sin recursividad
			}
			else{//Elemento es mayor a la raiz, se inserta en el lado derecho
				insertarNodo(arbol->der,n);//reemplazar esto sin recursividad
			}
		}
		else
			printf("\nEl Dato ingresado ya existe");
	}
}
//Funcion Insertar Iterativo Sin Recursividad.
void insertarIretativo(int x){
	Nodo *nuevo_nodo = new Nodo();
	nuevo_nodo->dato=x;
	nuevo_nodo->der=NULL;
	nuevo_nodo->izq=NULL;
	if(arbol==NULL){
		arbol = nuevo_nodo;//Nodo raiz
	}
	else{
		if(busquedaIterativo(arbol,x)==false){
			struct Nodo *anterior, *reco;
			anterior=NULL;
			reco=arbol;
			while(reco!=NULL){
				anterior = reco;
				if(x<reco->dato)
					reco = reco->izq;
				else
					reco = reco->der;
			}
			if(x<anterior->dato)
				anterior->izq=nuevo_nodo;
			else
				anterior->der=nuevo_nodo;
		}
		else
			printf("\nEl Dato ingresado ya existe");
	}
}
 
void mostrarArbol(Nodo *arbol, int cont){//contador ayuda a separar un nodo del otro
	if(arbol == NULL){
		return;
	}
	else{
		mostrarArbol(arbol->der,cont+1);
		int i;
		for(i=0;i<cont;i++){
			printf("   ");
		}
		printf("%d\n",arbol->dato);
		mostrarArbol(arbol->izq,cont+1);
	}
}
 
bool busqueda(Nodo *arbol,int n){
	if(arbol==NULL){//si el arbol esta vacio
		return false;
	}
	else if(arbol->dato==n){//si el nodo es igual al elemento buscado
		return true;
	}
	else if(n<arbol->dato){
		return busqueda(arbol->izq,n);
	}
	else{ // n>arbol->dato
		return busqueda(arbol->der,n);
	}
}
 
bool busquedaIterativo(Nodo *arbol,int x){
	if(arbol==NULL)//si el arbol esta vacio
		return false;
	else{
		while(arbol!=NULL && x!=arbol->dato){
			if(x<arbol->dato)
				arbol=arbol->izq;
			else
				arbol=arbol->der;
		}
		if(arbol!=NULL)
			return true;
		else
			return false;
	}
}
 
//Recorrido en profundidad - PreOrden
void preOrden(Nodo *arbol){
	if(arbol==NULL){
		return;
	}
	else{
		printf(" %d - ",arbol->dato);
		preOrden(arbol->izq);
		preOrden(arbol->der);
	}
}
 
void InOrden(Nodo *arbol){
	if(arbol==NULL){
		return;
	}
	else{
		InOrden(arbol->izq);
		printf(" %d - ",arbol->dato);
		InOrden(arbol->der);
	}
}
 
void PostOrden(Nodo *arbol){
	if(arbol==NULL){
		return;
	}
	else{
		PostOrden(arbol->izq);
		PostOrden(arbol->der);
		printf(" %d - ",arbol->dato);
	}
}

Espero que les pueda ayudar como me ayudo a mi.
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