2017-05-31 73 views
0

我想解決二叉樹的問題,但是我在構建樹時出錯了,也許。似乎連接到我,爲什麼我有段錯誤,當我嘗試打印出節點的數據:二叉樹頂視圖分割故障

//  3 
// / \ 
// 5  2 
///\ /\ 
// 1 4 6 7 
// \  /
// 9  8 

#include <stdio.h> 
#include <stdlib.h> 

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

void top_view(struct node * root) { 

    int array[100] = {0}; 
    int count = 0; 
    struct node * temp; 

    if (root) { 
     if (root->left) { 
      temp = root; 
      while (temp->left) { 
       printf("%d ", temp->left->data); 
       // array[count] = temp->left->data; 
       count++; 
       temp = temp->left; 
      } 
     } 
     array[count] = root->data; 
     printf("%d\n", array[count]); 

     if (root->right != NULL) { 
      printf("right %d\n", root->right->data); 
      temp = root; 
      printf("%p\n", temp->right->right); 
      printf("%d\n", temp->right->right->data); 
     } 

     // for (int i = 0; i < 100; i++) { 
     //  printf("%d ", array[i]); 
     // } 

    } else { 
     return ; 
    } 

} 



int main(int argc, char const *argv[]) 
{ 
    // struct node *nine = (struct node*)malloc(sizeof(struct node*)); 
    // nine->data = 9; 
    // nine->left = NULL; 
    // nine->right = NULL; 

    // struct node *ten = (struct node*)malloc(sizeof(struct node*)); 
    // ten->data = 10; 
    // ten->left = NULL; 
    // ten->right = NULL; 

    // struct node *one = (struct node*)malloc(sizeof(struct node*)); 
    // one->data = 1; 
    // one->left = ten; 
    // one->right = nine; 

    // struct node *four = (struct node*)malloc(sizeof(struct node*)); 
    // four->data = 4; 
    // four->left = NULL; 
    // four->right = NULL; 

    // struct node *five = (struct node*)malloc(sizeof(struct node*)); 
    // five->data = 5; 
    // five->left = one; 
    // five->right = four; 

    struct node *eight = (struct node*)malloc(sizeof(struct node*)); 
    eight->data = 8; 
    eight->left = NULL; 
    eight->right = NULL; 

    struct node *six = (struct node*)malloc(sizeof(struct node*)); 
    six->data = 6; 
    six->left = NULL; 
    six->right = NULL; 

    struct node *seven = (struct node*)malloc(sizeof(struct node*)); 
    seven->data = 7; 
    seven->left = eight; 
    seven->right = NULL; 

    struct node *two = (struct node*)malloc(sizeof(struct node*)); 
    two->data = 2; 
    two->left = six; 
    two->right = seven; 

    struct node *three = (struct node*)malloc(sizeof(struct node*)); 
    three->data = 3; 
    three->left = NULL; 
    three->right = two; 

    top_view(three); 

    return 0; 
} 

輸出是這樣:

3 
right 2 
0x7fc800000003 
[1] 2091 segmentation fault ./a.out 

我哪裏錯了呢?

+3

1)'8 =(結構節點*)malloc的(的sizeof(結構節點*));' - >'8 = malloc的(的sizeof(結構節點));' – BLUEPIXY

+2

應該是'的sizeof(結構節點)' - 你只是爲指針分配足夠的內存。 –

+1

'printf(「%d \ n」,temp-> right-> right-> data);''temp-> right-> right'爲NULL時會發生什麼? –

回答

0

我只是在代碼所做的編輯和它編譯,不給任何錯誤。我改變了使用malloc的方式來初始化一個新節點並刪除了cast。您還必須檢查是否存在root->right->right。這裏是你在代碼頂部顯示的三個。

/*  3 
* / \ 
* 5  2 
*/\ /\ 
* 1 4 6 7 
* \  /
* 9  8 
*/ 
#include <stdio.h> 
#include <stdlib.h> 

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

void top_view(struct node *root) { 

    int array[100] = {0}; 
    int count = 0; 
    struct node *temp; 

    if (root) { 
     if (root->left) { 
      temp = root; 
      while (temp->left) { 
       printf("%d ", temp->left->data); 
       // array[count] = temp->left->data; 
       count++; 
       temp = temp->left; 
      } 
     } 
     array[count] = root->data; 
     printf("%d\n", array[count]); 

     if (root->right != NULL) { 
      printf("right %d\n", root->right->data); 
      temp = root; 
      /*You must check it*/ 
      if(root->right->right != NULL){ 
       printf("%p\n", temp->right->right); 
       printf("%d\n", temp->right->right->data); 
      } 
     } 

      /*for (int i = 0; i < 100; i++) { 
      printf("%d ", array[i]); 
     }*/ 

    } else { 
     return ; 
    } 

} 



int main(int argc, char const *argv[]) 
{ 
    struct node *nine = malloc(sizeof(struct node)); 
    nine->data = 9; 
    nine->left = NULL; 
    nine->right = NULL; 

    /* struct node *ten = (struct node*)malloc(sizeof(struct node*)); 
    ten->data = 10; 
    ten->left = NULL; 
    ten->right = NULL;*/ 

    struct node *one = malloc(sizeof(struct node)); 
    one->data = 1; 
    one->left = NULL; 
    one->right = nine; 

    struct node *four = malloc(sizeof(struct node)); 
    four->data = 4; 
    four->left = NULL; 
    four->right = NULL; 

    struct node *five = malloc(sizeof(struct node)); 
    five->data = 5; 
    five->left = one; 
    five->right = four; 
    /*You should cast the result of a malloc just if you need it*/ 
    struct node *eight = malloc(sizeof(struct node)); 
    eight->data = 8; 
    eight->left = NULL; 
    eight->right = NULL; 

    struct node *six = malloc(sizeof(struct node)); 
    six->data = 6; 
    six->left = NULL; 
    six->right = NULL; 

    struct node *seven = malloc(sizeof(struct node)); 
    seven->data = 7; 
    seven->left = eight; 
    seven->right = NULL; 

    struct node *two = malloc(sizeof(struct node)); 
    two->data = 2; 
    two->left = six; 
    two->right = seven; 

    struct node *three = malloc(sizeof(struct node)); 
    three->data = 3; 
    three->left = five; 
    three->right = two; 

    top_view(three); 

    return 0; 
} 
0

您的printf正在嘗試打印附加到NULL指針的數據。像@約翰尼說,temp->right->right可能爲空,因此temp->right->right->data段錯誤

您應該添加一個停止鉤子。之前:

printf(temp->right->right->data); 

後:

if (temp->right->right) 
    printf(temp->right->right->data);