implementación árbol binario en cuestión C como se encuentra en K & R

votos
6

Así que he estado leyendo el libro de K & R C y tiene una pregunta .. en el sexto capítulo de estructuras en la página 140-141, no hay código que se parece a esto (Saqué algunas de las partes más irrelevantes)

/*
the program loops through a tree looking for some word
if it finds the word itll incremenet the count by 1 
if it doesnt itll add a new node
*/

 struct node {
    char *word;
    int count;
    struct node *left;
    struct node *right;
}

 main() {
    struct node *root;
    char word[1000];

    root = NULL;
    while(getword(word, MAXWORD) != EOF) /* getword just grabs 1 word at a time from a file of words */
        if(isalpha(word[0])) /* isalpha checks to see if it is a valid word */
            root = addNode(root, word);

    treeprint(root); /* prints the tree */
    return 0;
}

struct node *addNode(struct node *p, char *w) {
    int cond;

    if(p == NULL) {
        p = malloc(sizeof(struct node)); /* allocates memory for the new node */
        p -> word = strdup(w);
        p -> count = 1;
        p -> left = p -> right = NULL;
    }

    else if ((cond = strcmp(w, p -> word)) == 0)
        p -> count++;

    else if(cond < 0)
        p -> left = addNode(p -> left, w);

    else
        p -> right = addNode(p -> right, w);

    return p;
}

Y mi confusión es en la función main () en la raíz = addNode (raíz, palabra)

Si addNode devuelve un puntero al nodo recién añadido (o al nodo de esa palabra es en si su ya int árbol), que no es que perder todos los datos anteriores el árbol? no debe erradicar estancia ya que la raíz del árbol?

¡Gracias!

Publicado el 03/07/2011 a las 08:25
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
3

Su malentendido es en el comportamiento de addNode. No , no devuelve un puntero al nodo recién añadido; Más bien, se devuelve un puntero al nodo que fue pasado en, p(a menos que era NULL).

Dado que la única vez que root == NULLes cuando se añade la primera palabra, roottendrá el mismo valor a partir de ese momento, y se les asigna este mismo valor una y otra vez. Esto es sólo una forma elegante de hacer frente a los árboles vacíos, que están representados por el NULLpuntero.

Recuerde que cada llamada recursiva de addNodetiene un diferente valor para p, sin embargo. Así es como funcionan las variables locales; que son locales a una invocación especial de la función, no a la función en su conjunto. Tal vez esto llevó a su falta de comprensión de la conducta de la función.

Respondida el 03/07/2011 a las 08:38
fuente por usuario

votos
5

rootSiempre está quedando como raíz del árbol. rootse pasa como el primer parámetro de addNodela cual sólo se mallocsi eso es NULL, es decir, cuando rootse pasa por primera vez. En adelante lo llama no va a cambiar root, sólo se modificará count, lefto right. Cabe destacar que en recursivas addNodellamadas pno se pasa, más se deja o se pasa hijo derecho. Intenta pasar por el árbol con un papel y un lápiz / bolígrafo y se dará cuenta de cómo se están añaden los nodos.

Respondida el 03/07/2011 a las 08:39
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more