[C con Clase] Problema en Arbol con 3 Nodos

Salvador Pozo Coronado salvador en conclase.net
Vie Mar 15 20:54:36 CET 2013


Estimado Alejandro,

Con fecha miércoles, 13 de marzo de 2013, 22:58:24, escribió:

AF> Hola amigos, estoy intentando llenar 1 Arbol de tres 
AF> nodos a lo maximo, tengo 1 funcion para insertar los 
AF> nodos al arbol:

Hola:

Disculpa  el  retraso, me ha costado analizar el programa y comprender
el propósito de cada método. :)

No  estoy  seguro,  pero  creo  que  el  problema  está  en  el método
"treeContains"

Supongamos que tenemos un árbol (simplificando) de este tipo:
                           root
                             |
                           Alfabeto
               /               |
             Reading         Writing
    /
 Speed1

Ahora  tenemos  que añadir un nodo "Speed2" como hijo de "Speed1", por
lo tanto llamamos a treeContains(root, "Speed1")

La primera llamada hace una llamada recursiva con:
treeContains(alfabeto, "Speed1");

La segunda llamada hace una tercera llamada recursiva con:
treeContains(reading, "Speed1");

Ahora vamos paso a paso, porque aquí está el error:

- root no es NULL
- la cadena en reading no es "Speed1".
- root->left  no  es NULL pero la cadena en root->left sí es "Speed1",
  por  lo que no se cumple el if (que debería haberse cumplido, ya que
  esta es la rama adecuada para continuar.
-  tampoco se cumplen los if restantes, por lo tanto, se retorna NULL,
  y  el  nodo  no se inserta en el punto adecuado, sino que se crea un
  nuevo árbol.

Habría que modificar la función:

TreeNode* SkillTree::treeContains( TreeNode *root, char* parentName )
{ 
    if (root==NULL) {
        return NULL;
    }
    else if ( strcmp(parentName, root->item.getName())==0 ) { 
        return root;
    }
    else if ( root->left!=NULL)
    {
        return treeContains( root->left, parentName );
    }
    else if (root->middle !=NULL) {
        return treeContains( root->middle, parentName );
    }
    else if (root->right!=NULL) {
        return treeContains( root->right, parentName ); 
    }
    return NULL;
}

En  cualquier  caso,  no tomes esta versión al pié de la letra, porque
tampoco estoy seguro de que funcione, ya que no he podido probarla. Lo
que  sí  estoy  seguro  es  que la versión que has enviado no funciona
bien.

Hasta pronto.
-- 
Saludos,
Salvador  mailto:salvador en conclase.net
Con Clase:  http://www.conclase.net





Más información sobre la lista de distribución Cconclase