2011-11-01 14 views
5
struct Ternary { 

    char current; 
    bool wordend; 
    Ternary* left; 
    Ternary* mid; 
    Ternary* right; 
    Ternary(char c='@',Ternary* l=NULL, Ternary* m=NULL, Ternary* r=NULL,bool end=false) 
    { 
     wordend=end; 
     current=c; 
     left=l; 
     mid=m; 
     right=r; 
    } 
}; 

void add(Ternary* t, string s, int i) { 

    if (t == NULL) { 
     Ternary* temp = new Ternary(s[i],NULL,NULL,NULL,false); 
     t=temp; 
    } 

    if (s[i] < t->current) { 
     add(t->left,s,i); 
    } 
    else if (s[i] > t->current) { 
     add(t->right,s,i); 
    } 
    else 
    { 
     if (i + 1 == s.length()) { 
      t->wordend = true; 
     } 
     else 
     { 
      add(t->mid,s,i+1); 
     } 
    } 
} 

Cuando agrego secuencia de palabras utilizando add() la cadena están consiguiendo imprime dentro if(t==NULL) segmento, pero el árbol no está consiguiendo es decir nodos están formados no conseguir vinculado.ternario Búsqueda Árbol

Respuesta

4
t=temp; 

Esta línea no tiene ningún efecto fuera de la función add(). El puntero de la persona que llama no se actualiza.

Se podría cambiar su función para devolver un Ternary* (Retorno t en este caso al final de la misma), y cambiar los sitios de llamadas a:

Ternary *tree = 0; 
tree = add(tree, "hello", 1); 
tree = add(tree, "bye", 1); 
... 
+0

o declarar argumento como complemento (ternario ** t, cadena s, int i) y luego hago * t = temperatura –

+0

En lugar de utilizar la temperatura, también probé el siguiente declaración t = new Ternary (s [i]); Y si uso tree = ... entonces estoy perdiendo mi nodo raíz del árbol – CoderXX

+0

@Pratik: sin cambiar nada en tu código excepto poniendo 'return t;' al final de 'add()' y usando 'add 'como indiqué, no perderás nada. – Mat

0

Sólo un pequeño truco hará:

Reemplazar:

void add(Ternary* t, string s, int i) 

Con:

void add(Ternary*& t, string s, int i) 

Eso es más limpio que pasa y entonces la lectura de salida como esta:

tree = add(tree, "bye", 1); 

Cuando en C++, hacer uso de sus referencias :) En C que iba a cambiar la firma de función:

void add(Ternary** t, string s, int i) 

y recuerde corregir t en lugares relevantes.

Bueno, C++ es claramente más limpio :)

Cuestiones relacionadas