2013-05-19 2 views
2

Я хочу создать двоичное дерево и пересечь его путем обхода порядка, и я использую рекурсивный метод. Этот код может быть скомпилирован, но не может работать корректно, и я обнаружил, что он, возможно, не может закончить функцию CreateBitree(), но я не знаю, где проблема.Рекурсивно создавать и перемещать двоичное дерево в C

#include <stdio.h> 
#include <malloc.h> 

typedef struct BiNode{ 
    int data; 
    struct BiNode *lchild; 
    struct BiNode *rchild; //left and right child pointer 
}BiNode; 

int CreateBiTree(BiNode *T); 
int TraverseBiTree(BiNode *T); 

int main() { 
    BiNode *t; 
    CreateBiTree(t); 
    TraverseBiTree(t); 
    return 0; 
} 

int CreateBiTree(BiNode *T) {   //create a binary tree by preorder traversal 
    char tmp; 
    scanf("%c", &tmp); 
    if(tmp == ' ') 
    T = NULL; 
    else { 
     T = (BiNode *)malloc(sizeof(BiNode)); 
     T -> data = tmp; 
     CreateBiTree(T -> lchild); 
     CreateBiTree(T -> rchild); 
    } 
    return 1; 
} 

int TraverseBiTree(BiNode *T) {  //traverse a binary tree by preorder traversal 
    if(T != NULL) { 
     printf("%c\n", T -> data); 
     TraverseBiTree(T -> lchild); 
     TraverseBiTree(T -> rchild); 
    } 
    return 1; 
} 

Например, когда я входная последовательность предзаказа как «ABC## DE # G ## F ###» («#» означает пространство), а потом еще подводил меня к входу, я думаю, что TraverseBiTree() функция не была выполнена.

+0

Когда вы говорите, что это не сработает ... Что d Вы имеете в виду? Неправильно? Ошибка сегментации? Что-то другое? – FDinoff

+2

Вы передаете значения указателя в CreateBiTree * значением *. Сторона-вызывающая сторона никогда не получает обновленных указателей (включая себя). – WhozCraig

ответ

4

Назначение значения указателя на указатель внутри функции не имеет никакого эффекта вне сферы действия этой функции. Делать это:

int CreateBiTree(BiNode *T) { 
    /* ... */ 
    T = NULL; 

такой же, как это сделать:

int func(int i) { 
    /* ... */ 
    i = 0; 

Указатель аргумента необходимо в следующих случаях:

int CreateBiTree(BiNode **T) { 
    /* ... */ 
    T[0] = NULL; // or... *T = NULL; 

С некоторыми изменениями исходного кода:

int main() { 
    BiNode *t; 
    CreateBiTree(&t); 
    TraverseBiTree(t); 
    return 0; 
} 

int CreateBiTree(BiNode **T) {   //create a binary tree by preorder traversal 
    char tmp; 
    scanf("%c", &tmp); 
    if(tmp == ' ') 
    T[0] = NULL; 
    else { 
     T[0] = (BiNode *)malloc(sizeof(BiNode)); 
     T[0]-> data = tmp; 
     CreateBiTree(&(T[0]->lchild)); 
     CreateBiTree(&(T[0]->rchild)); 
    } 
    return 1; 
} 
+0

Большое спасибо, и я многому научился. – winterszhang

Смежные вопросы