2017-01-07 2 views
3

아래 프로그램에서 BST에 배열 arr에있는 값으로 채우려고합니다. 이 프로그램은 오랜 시간 동안 루프에서 실행 된 다음 세그먼트 오류가 발생합니다. 누군가 내가 여기서 누락 된 것을 설명해 주시겠습니까?이진 트리 - 값을 추가 할 수 없습니다

struct node { 
     int value; 
     struct node *left; 
     struct node *right; 
}; 

void add(struct node **root, int i); 
int arr[14] = {30, 50, 25, 32, 45, 55, 20, 27, 31, 43, 47, 52, 88}; 

int main(void) 
{ 
     struct node *root = malloc(sizeof(struct node)); 
     root->value = 35; 
     root->left = NULL; 
     root->right = NULL; 

     struct node *start = root; 
     int i; 

     for (i = 0; i < 13; i++) { 
       add(&root, arr[i]); 
       root = start; 
     } 

     printf("%d\n", root->value); 
     printf("%p\n", root->right); 
     printf("%p\n", root->left); 
} 

void add(struct node **root, int i) 
{ 
     while ((*root) != NULL) { 
       printf("left: %p\n", (*root)->left); 
       if (i < (*root)->value) { 
         add(&((*root)->left), i); 
       } else { 
         add(&((*root)->right), i); 
       } 
     } 
     *root = malloc(sizeof(struct node)); 
     (*root)->value = i; 
     (*root)->left = NULL; 
     (*root)->right = NULL; 
} 
+0

추가'의 마지막에 새로운 노드를 할당의 의미는 무엇인가 : 제대로 그 루프 그냥 다음과 같을해야 할 (목표를 가정하면 배열의 값을 호스트하는 것입니다) 및 포인터를 반환? –

답변

3

당신은 재귀를 사용하고, 그래서 while도있을 할 이유가 없다. 그것은이 경우-다른 논리적 구조이어야한다 : 목표는 이었다 재귀를 제거하면

void add(struct node **root, int i) 
{ 
    if (*root) 
    { 
     if (i < (*root)->value) { 
      add(&((*root)->left), i); 
     } else { 
      add(&((*root)->right), i); 
     } 
    } 
    else 
    { 
     *root = malloc(sizeof(struct node)); 
     (*root)->value = i; 
     (*root)->left = NULL; 
     (*root)->right = NULL; 
    } 
} 

, 다음 솔루션은 빈을 해결 때까지 잠시 루프를 사용하지만 나무 아래 root을 이동하는 것입니다 노드 :

void add(struct node **root, int i) 
{ 
    while(*root) 
    { 
     if (i < (*root)->value) { 
      root = &(*root)->left; 
     } else { 
      root = &(*root)->right; 
     } 
    } 
    *root = malloc(sizeof(struct node)); 
    (*root)->value = i; 
    (*root)->left = NULL; 
    (*root)->right = NULL; 
} 

마지막 main에 대한 루프 반복 불필요 root 재설정. `) (

int main(void) 
{ 
    struct node *root = NULL; 

    int i; 
    for (i = 0; i < 13; i++) 
     add(&root, arr[i]); 

    printf("%d\n", root->value); 
    printf("%p\n", root->right); 
    printf("%p\n", root->left); 
} 
+0

감사합니다. 나는 이것을 위해 매달릴 가치가있다. – babon