我正在尝试解决有关二叉树的问题,但是我在构建树时遇到了问题。这似乎与我有关,为什么当我尝试打印出节点数据时出现分段错误:
// 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
我错了吗?
答案 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;
}