pasar procedimientos recursivos a funciones en bst

Iniciado por Beginner Web, 6 Enero 2019, 05:38 AM

0 Miembros y 2 Visitantes están viendo este tema.

Beginner Web

Hola queria saber como puedo pasar los siguientes "prodecimientos" a funciones, en el primer algoritmo se modifica el valor de una variable pasada por referencia el cual en el main me dice la cantidad exacta de vocales de un arbol binario de busqueda

Código (cpp) [Seleccionar]
void contarNodosQueContenganVocales(pnodo arbol, int &vocales)
{
if(arbol!=NULL){
switch(arbol->dato){
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': vocales++;
}
contarNodosQueContenganVocales(arbol->izq,vocales);
contarNodosQueContenganVocales(arbol->der,vocales);
}
}


Y este  otro procedimiento cuenta la cantidad de nodos que tienen un solo hijito
Código (cpp) [Seleccionar]
void cantidad_nodos(arbol a, int &c)
{
if(a!=NULL){
if((a->izq==NULL && a->der!=NULL) || (a->izq!=NULL && a->der==NULL))
c++;
cantidad_nodos(a->izq,c);
cantidad_nodos(a->der,c);
}
}

:laugh:

uno por uno MAFUS
7w7

MAFUS

Entiendo qué quieres juntar las dos en una sola función.

CalgaryCorpus

No pases variable alguna, solo devuelve el valor que te lo interesa.

Tipicamente será

condicion = ...  // Chequear dato en nodo actual

return condicion + f(nodo izquierdo) + f(nodo derecho)

Posiblente el modo null será especial.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

Beginner Web

Cita de: CalgaryCorpus en  6 Enero 2019, 16:24 PM
No pases variable alguna, solo devuelve el valor que te lo interesa.

Tipicamente será

condicion = ...  // Chequear dato en nodo actual

return condicion + f(nodo izquierdo) + f(nodo derecho)

Posiblente el modo null será especial.
Ya he logrado resolverlos gracias Señor CalgaryCorpus  ;-)
Código (cpp) [Seleccionar]
int vocales(arbol a)
{
int contador=0;
if(a!=NULL){
contador=vocales(a->izq)+vocales(a->der);
switch(a->dato){
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': contador++;
}
}
return contador;
}

int cantidad_nodos(arbol a)
{
int contador=0;
if(a!=NULL){
contador=cantidad_nodos(a->izq)+cantidad_nodos(a->der);
if((a->izq!=NULL && a->der==NULL) || (a->izq==NULL && a->der!=NULL))
contador++;
}
return contador;
}

Asi queda mas elegante que estar haciendo un procedimiento recursivo :)
7w7

CalgaryCorpus

Puedo estar equivocado, pero creo que cantidad_nodos debería sumar siempre uno.
No parece bien los if de la línea 22
Algo así:


int cantidad_nodos(arbol a) {
   int contador=0;
   if(a!=NULL) {
      contador=1 + cantidad_nodos(a->izq)+cantidad_nodos(a->der);
   }
   return contador;
}

Aqui mi perfil en LinkedIn, invitame un cafe aqui

K-YreX

Cita de: CalgaryCorpus en  8 Enero 2019, 14:23 PM
Puedo estar equivocado, pero creo que cantidad_nodos debería sumar siempre uno.

Aunque lo ha llamado <cantidad_nodos> lo que quiere es contabilizar los nodos que tienen un único hijo, por eso está implementado así :-X

Cita de: Beginner Web en  6 Enero 2019, 05:38 AM
Y este  otro procedimiento cuenta la cantidad de nodos que tienen un solo hijito
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;