Binarne drzewo implementacja w C pytanie, jak znaleźć w K & R

głosy
6

Więc Czytałem poprzez książki K & R C i masz pytanie .. w 6 rozdziale na elemencie na stronie 140-141, jest kod, który wygląda następująco (wyjąłem niektóre z bardziej nieistotnych części)

/*
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;
}

A mój zamieszanie jest w funkcji main () w root = addNode (korzeń, słowo)

Jeśli addNode zwraca wskaźnik do nowo dodanego węzła (albo do węzła, że ​​słowo jest, jeśli jej już int on tree), czy nie, że „stracić” wszystkie powyższe dane drzewie? Nie należy wykorzenić pobyt jako korzenia drzewa?

Dzięki!

Utwórz 03/07/2011 o 08:25
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
3

Twój nieporozumienie jest w zachowaniu addNode. Robi nie zwracają wskaźnik do nowo dodanego węzła; raczej, zwraca wskaźnik do węzła, który został przekazany w, p(chyba, że było NULL).

Ponieważ jedyny raz, że root == NULLjest bardzo, gdy pierwsze słowo dodaje, rootbędą miały taką samą wartość od tego momentu, a przydzielane to bardzo samą wartość w kółko. To jest po prostu elegancki sposób radzenia sobie z pustych drzew, które są reprezentowane przez NULLwskaźnik.

Pamiętaj, że każda rekurencyjne wywołanie addNodema inną wartość dla p, choć. Jest to, jak działają zmienne lokalne; są lokalne dla danego wywołania funkcji, a nie do funkcji jako całości. Może to doprowadziło do nieporozumień zachowania funkcji.

Odpowiedział 03/07/2011 o 08:38
źródło użytkownik

głosy
5

rootjest zawsze pobytu jako korzeń drzewa. rootjest przekazywany jako pierwszy parametr addNode, który będzie tylko mallocjeśli jest NULL, to znaczy, gdy rootjest przekazywana po raz pierwszy. Później nazywa to się nie zmieni root, będzie tylko zmodyfikować count, leftlub right. Zauważ, że w rekurencyjnych addNodewywołań pnie jest przekazywana, a to w lewo lub w prawo dziecko jest przekazywane. Spróbuj przejść przez drzewo z papieru i ołówek / długopis i zdasz sobie sprawę, jak węzły są dodawane coraz.

Odpowiedział 03/07/2011 o 08:39
źródło użytkownik

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