Dev - C++ - Arbol Binario de Busqueda - Nodos izq y der

 
Vista:
sin imagen de perfil

Arbol Binario de Busqueda - Nodos izq y der

Publicado por Danny (1 intervención) el 05/07/2014 02:49:33
Saludos a todos!!!! soy nuevo en esta comunidad :D ... vivo en Bogota Colombia y estoy cursando 3º semestre de Tecnologia en Sistemas ... el camino no ha sido muy pedregoso, al menos no hasta cuando me topé con la asignatura de Estructuras de Datos :S ... precisamente de esto trata mi cuestion, es un Codigo en el cual a un ABB se le deben contar los nodos insertados tanto a la izquierda como a la derecha ... mi programa cumple dicha funcion (en parte) porque en el caso de que por ejm un nodo padre insertado a la izquierda de la raiz (o cualquier otro nodo) tenga un hijo insertado a la derecha, este no me lo cuenta (tambien sucede lo mismo para los nodos insertados a la derecha)

Aqui el codigo:

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
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
 
#define maxpila 100
 
struct nodo
{
  int info;
  struct nodo *llink;
  struct nodo *rlink;
}*raiz;
 
struct PILA{
       int tope;
       struct nodo *cont[maxpila];
};
 
void limpiarpila(struct PILA *pila) {
    pila->tope=0;
}
 
bool pilavacia (struct PILA *pila){
     bool valor;
     if (pila->tope==0) valor=true;
     else valor = false;
     return valor;
     }
 
bool pilallena (struct PILA *pila){
     bool valor;
     if (pila->tope==maxpila) valor=true;
     else valor = false;
     return valor;
     }
 
void meterpila(struct PILA *pila, struct nodo *p) {
 
     if (pilallena (pila) == false){
         pila->tope=pila->tope+1;
         pila->cont[pila->tope]=p;
     }
     else cout << "\nERROR: No se puede insertar en la pila, ya que esta llena";
 
 
     }
 
   void sacarpila(struct PILA *pila, struct nodo **q){
 
     if (pilavacia(pila)==false){
        *q=pila->cont[pila->tope];
        pila->tope--;
        }
    else cout << "\nERROR: No se puede sacar de la pila, ya que esta vacia";
 
 
    }
 
void creararbol(){
 
struct nodo *p, *q, *r;
 
int n, i;
cout << "Cuantos nodos va a tener el arbol?";
cin >> n;
raiz =  (struct nodo *)malloc(sizeof(struct nodo));
cout << "Por favor digite la info del nodo raiz del arbol: ";
cin  >> raiz->info;
raiz->llink = NULL;
raiz->rlink = NULL;
 
for (i=2;i<=n;i++){
    p = (struct nodo *) malloc(sizeof(struct nodo));
    cout << "Por favor digite la info del nodo " << i << " del arbol: ";
    cin >> p->info;
    p->llink = NULL;
    p->rlink = NULL;
 
    q=raiz;
 
    while (q!=NULL){
 
          r=q;
 
          if (p->info > q->info) q=q->rlink;
          else q=q->llink;
 
          }
 
          if (p->info > r->info) r->rlink=p;
          else r->llink=p;
 
 
}
 
}
 
void recorrerprofDerecha(){
 struct PILA pila;
 struct nodo *p;
 
 int cont=0;
 
 limpiarpila(&pila);
 meterpila (&pila, raiz);
 
 cout << "\n\nLos datos del arbol recorrido en profundidad son: \n";
 
 while (pilavacia(&pila)==false){
       sacarpila (&pila,&p);
       cout << endl << p->info;
 
       if (p->rlink != NULL) {
 
                   meterpila (&pila, p->rlink);
                   cont++;
 
            }
 
 
 
       }
 
     cout << "\n\nLos datos del arbol insertados a la derecha son: \n"<<cont;
 
}
 
void recorrerprofIzquierda(){
 struct PILA pila;
 struct nodo *p;
 
 int cont=0;
 
 limpiarpila(&pila);
 meterpila (&pila, raiz);
 
 cout << "\n\nLos datos del arbol recorrido en profundidad son: \n";
 
 while (pilavacia(&pila)==false){
       sacarpila (&pila,&p);
       cout << endl << p->info;
 
        if (p->llink != NULL){
 
                  meterpila (&pila, p->llink);
                  cont++;
 
            }
 
       }
 
  cout << "\n\nLos datos del arbol insertados a la izquierda son: \n"<<cont;
 
}
 
int main(void)
{
 
 
     creararbol();
     recorrerprofDerecha();
     recorrerprofIzquierda();
 
 
 
	getch();
 
  return 0;
}

Gracias por su atencion y Hola de nuevo! :D
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

Arbol Binario de Busqueda - Nodos izq y der

Publicado por Ricardo (5 intervenciones) el 20/07/2014 05:00:45
Para resolverlo en forma mucho más sencilla debes utilizar recursividad:

int contar(nodo *raiz){
if (raiz != NULL)
return 1+contar((*raiz)->llink)+contar((*raiz)->rlink);
else
return 0;
}
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