2013-05-19 8 views
2

이진 트리를 생성하여 선주문 순회로 트래버스하고 재귀 적 방법을 사용하고 싶습니다. 이 코드는 컴파일 할 수는 있지만 제대로 실행되지 않으며 어쩌면 CreateBitree() 함수를 완료 할 수 없다는 것을 알았지 만 어디에 문제가 있는지 알 수 없습니다.C에서 재귀 적으로 이진 트리를 만들고 트래버스하기

내가 입력과 같은 예약 주문 순서 "ABC## DE # G ## F는 ###"("#"이 공간을 의미) 예를 들어
#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; 
} 

, 다음은 여전히 ​​입력에 저를 보자, 나는 TraverseBiTree() 생각 함수가 실행되지 않았습니다.

+0

작동하지 않는다고 할 때 ... 무슨 d 너 그 뜻이야? 틀렸어? 세그멘테이션 오류? 다른 것? – FDinoff

+2

* value *에 의해 포인터 값을 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

관련 문제