二叉树顶视图分割故障

时间:2017-05-31 14:30:53

标签: c tree segmentation-fault

我正在尝试解决有关二叉树的问题,但是我在构建树时遇到了问题。这似乎与我有关,为什么当我尝试打印出节点数据时出现分段错误:

//      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

我错了吗?

2 个答案:

答案 0 :(得分:0)

您的printf正在尝试打印附加到NULL指针的数据。就像@Johnny所说,temp->right->right可能为空temp->right->right->data段错误

你应该添加一个停止钩子。之前:

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

后:

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

答案 1 :(得分: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;
}