Dev - C++ - Ayuda con Arbol Binario Sin recursividad en C

 
Vista:
sin imagen de perfil
Val: 60
Ha aumentado su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con Arbol Binario Sin recursividad en C

Publicado por Patricio (25 intervenciones) el 08/05/2019 17:46:33
Este es el codigo que escribi del arbol binario hecho con recursividad pero estoy tratando de crear el arbol sin recursividad y no logro ver como hacerlo. Pueden mostrarme como seria el codigo SIN recursividad???
Gracias.

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
#include <stdio.h>
#include <stdlib.h>
 
 
typedef struct nodo abb;
 
struct nodo
{
	int dato;
	abb *der;
	abb *izq;
};
 
abb *nuevoAbb(){
	return (abb *)malloc(sizeof(abb)); // solicita memoria para nuevo nodo y lo retorna.
}
 
abb *insertarAbb(abb *t, int dato){ //abb *t es la raiz. es el primer dato en el arbol.
 
	abb *p = nuevoAbb();
	p->dato = dato;
	p->izq = p->der = NULL;
 
	if(t==NULL)
		return p;
 
	if(p->dato < t->dato) //Ve si t dato es mayor que p dato.
		t->izq = insertarAbb(t->izq,dato);//si es menor lo mete en la izquierda
	else
		t->der = insertarAbb(t->der,dato); //si es mayor lo mete a la derecha
 
	return t; //Devuelve el valor de t al avanzar, el t se va reemplazando en los ifs
}
 
int sumar_modulo (abb *t)
{
	if (t==NULL)
	   return 0;
	else{
		return (t -> dato + sumar_modulo (t->izq) + sumar_modulo (t-> der)  );
	}
}
 
int buscarDato(abb *t, int dato) //busqueda normal usando recursivdad
{
	if(t==NULL)
		return 0;
 
	if(t->dato==dato) //encontro el dato
		return 1;
 
	if(dato < (t->dato))
		return buscarDato(t->izq,dato); //recursividad, vuelve al inicio y se mueve a la izquierda
	else
		return buscarDato(t->der,dato);//recursividad, vuelve al inicio y se mueve a la izquierda
}
 
void mostrarAbb(abb *t)
{
	if(t!=NULL)
	{
		printf("%d\n",t->dato);
		mostrarAbb(t->izq);
		mostrarAbb(t->der); //es corto el codigo gracias a recursividad
	}//el programa principal estaria haciendo la acomulacion si tubieramos que estar acomulando los valores, pa eso habria que retornar el valor
}
 
/* comienza el recorrido inorden del árbol */
void inOrden(abb *t)
{
	/* si el árbol no está vacío, entonces recórrelo */
	if (t != NULL) {
	inOrden(t->izq);
	printf("%3d", t->dato);
	inOrden(t->der);
	}
}
 
/* comienza el recorrido preorden del árbol */
void preOrden(abb *t)
{
	/* si el árbol no está vacío, entonces recórrelo */
	if (t != NULL) {
	printf("%3d", t->dato);
	preOrden(t->izq);
	preOrden(t->der);
	}
}
 
 
/* comienza el recorrido postOrden del árbol */
void postOrden(abb *t)
{
	/* si el árbol no está vacío, entonces recórrelo */
	if (t != NULL) {
	postOrden(t->izq);
	postOrden(t->der);
	printf("%3d", t->dato);
	}
}
 
//  ***************************** Programa Ppal ********************************* //
int main(int argc, char *argv[])
{
	abb *t = nuevoAbb();
	t->dato = 15;
	t->izq = t->der = NULL;
 
	insertarAbb(t,7);
	insertarAbb(t,18);
	insertarAbb(t,8);
    insertarAbb(t,37);
    insertarAbb(t,56);
	insertarAbb(t,90);
	insertarAbb(t,20);
 
	printf ("\n\n\t Mostrar recorrido:\n");
	mostrarAbb(t);
 
	int num;
	int sumatotal = sumar_modulo(t);
 
	printf("\n\n       La suma1 Total es: %d", sumatotal);
	printf("\n\n       La suma2 Total es: %d", sumar_modulo(t));
 
	printf("\n ____________________________________________________________");
	printf("\n\n\t Ingrese numero a Buscar: ");
	scanf("%d",&num);
	printf("\n\n\t Buscar nodo en el arbol con raiz: %d , con valor  : %i ", &t, num);
 
	if(buscarDato(t, num))
		printf("\n\t     Encontrado");
	else
		printf("\n\t     No encontrado");
 
	/* recorre el árbol en preorden */
	printf ("\n\n\tEl recorrido en Preorden es:\n");
	preOrden(t);
 
	/* recorre el árbol en in inorden */
	printf("\n\n\t El recorrido Inorden es:\n");
	inOrden(t);
 
	/* recorre el árbol en postOrden */
	printf("\n\n\tEl recorrido en PostOrden es:\n");
	postOrden(t);
 
	return 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
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con Arbol Binario Sin recursividad en C

Publicado por Rodrigo (539 intervenciones) el 09/05/2019 13:44:24
Para insertar, hay que hacer un recorrido desde la raiz, movie dose con la misma logica como si se estuviera buscando el elemento a insertar. Se detiene al encontrar en ese recorrido, un hijo null y en ese punto se inserta.
El caso trivial es que el arbol esté vacío.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 60
Ha aumentado su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con Arbol Binario Sin recursividad en C

Publicado por Patricio (25 intervenciones) el 10/05/2019 04:01:30
Ya pude hacer insertar de forma iterativa los datos, pero estoy muy perdido en como puedo hacer una busqueda iterativa.
Aqui tengo lo que he hecho.
La busqueda iterativa no entiendo como hacerla

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
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
 
struct Nodo {
	int dato;
	Nodo *der;
	Nodo *izq;
};
 
Nodo *arbol=NULL;
 
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{
		return busqueda(arbol->der,n);
	}
}
//PROBLEMA ACA**********************************************************************
bool busquedaIterativo(Nodo *arbol,int x){
	int ok = 0;
	if(arbol==NULL)//si el arbol esta vacio
		return false;
	else{
		struct Nodo *reco, *anterior;
		reco=arbol;
		while(reco!=NULL && x!=reco->dato){
			anterior=reco;
			if(x<reco->dato)
				reco=reco->izq;
			else
				reco=reco->der;
		}
		if(x==anterior->dato)
			return true;
		else
			return false;
	}
}
 
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{
		struct Nodo *anterior, *reco;
		//int valorRaiz = arbol->dato;
		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;
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con Arbol Binario Sin recursividad en C

Publicado por Rodrigo (539 intervenciones) el 10/05/2019 06:47:54
No tengo idea por que no funciona, aqui mis impresiones:

No requieres 2 punteros, solo 1 basta.
Se inicia en la raiz.
Comprueba en la condicion del ciclo si ese puntero ya es null. Si no es null te metes al ciclo, si no se termina.
Si se termina, se puede retornar false.
Dentro del ciclo compruebas si lo apuntado por el puntero es el valor que buscas, y si es, retornas true,.
Si no es, actualizas ese unico puntero dependiendo si el valor es mayor o menor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con Arbol Binario Sin recursividad en C

Publicado por Gustavo Porcel (1 intervención) el 16/10/2021 15:54:14
Podrías explicarme cómo pensaste la función "insertarIterativo", o sea, qué lógica utilizaste.
Por ejemplo, no entiendo que función cumple la variable "reco".
gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con Arbol Binario Sin recursividad en C

Publicado por daniela (1 intervención) el 11/10/2020 21:52:34
Me puede ayudar a recorrer en PostOrden sin utlizar la recursividad .C#
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con Arbol Binario Sin recursividad en C

Publicado por Rodrigo (539 intervenciones) el 11/10/2020 22:36:25
Creo que usar un stack podria resolver el problema de escribir en post-orden

Pon la raiz en el stack
Loop hasta que no haya stack
- sacas del stack
- escribes el valor
- pon el hijo derecho en el stack (si no es null)
- pon el hijo izquierdo en el stack (si no es null)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar