为什么我在这个程序中遇到分段错误?

时间:2015-06-07 09:37:45

标签: c data-structures tree binary-tree

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

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

struct Btree *root = NULL;

struct Btree *createTree(int i,int *input,int n){

    int leftChild = 2*i+1,rightChild = 2*i+2;
    struct Btree *newNode = NULL;
    newNode = (struct Btree *)malloc(sizeof(struct Btree));
    if(input[i] == -1){
           return NULL
    }else{
          newNode->data = input[i];
          newNode->left = NULL;
          newNode->right = NULL;
    }
    if(root == NULL){
        root = newNode;
    }
    if(leftChild > n || input[leftChild] == -1 ){
        newNode->left = NULL;
    }else{
        newNode->left = createTree(leftChild,input,n);      
    }
    if(rightChild > n || input[rightChild] == -1 ){
        newNode->right = NULL;
    }else{
        newNode->right = createTree(rightChild,input,n);
    }
    return newNode;
}

void inorder(struct Btree *root){
    if(root){
        inorder(root->left);
        printf("%d",root->data);
        inorder(root->right);
    }
}


int main(){
    int n,i;
    printf("Enter values of N : \t");
    scanf("%d",&n);
    int input[n];
    printf("enter input nodes");
    for(i=0;i<n;i++){
        scanf("%d",&input[i]);
    }   
    for(i=0;i<n;i++){
        printf("%d ",input[i]);
    }       
    printf("\n");   
    root = createTree(0,input,n);           
    inorder(root);
    return 0;
}

在这个程序中,我试图构建二叉树(不是二进制搜索树)。为此我写了上面的代码,但我得到了分段错误。

我在这里做的是从stdin获取输入并存储到我试图构建二叉树的输入数组中。

从评论中更新

我的意见是:

1 2 3 4 -1 -1 5

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误。所以基本上正确的代码应如下所示:

#include<stdio.h>
#include<stdlib.h>
struct Btree{
    int data;
    struct Btree *left;
    struct Btree *right;
};



struct Btree *createTree(int i,int *input,int n){
    int leftChild = 2*i+1,rightChild = 2*i+2;
    struct Btree *newNode = NULL;
    newNode = (struct Btree *)malloc(sizeof(struct Btree));
    newNode->data = input[i];
    newNode->left = NULL;
    newNode->right = NULL;
    if(leftChild >= n || input[leftChild] == -1 ){
        newNode->left = NULL;
    }else{
        newNode->left = createTree(leftChild,input,n);//you were passing the data of node which can vary to any integer       
    }
    if(rightChild >= n || input[rightChild] == -1 ){
        newNode->right = NULL;//While processing rightchild you have put the left child as null which was basically the reason for segmentation fault.
    }else{
        newNode->right = createTree(rightChild,input,n);//passing data of node instead of position 
    }
    return newNode;
}

void inorder(struct Btree *root){
    if(root){
        inorder(root->left);
        printf("%d\n",root->data);
        inorder(root->right);
   }
   return;
}


int main(){
    int n,i;
    printf("Enter values of N : \t");
    scanf("%d",&n);
    int input[n];
    struct Btree *root = NULL;
    printf("enter input nodes");
    for(i=0;i<n;i++){
        scanf("%d",&input[i]);
    }   
    for(i=0;i<n;i++){
        printf("%d ",input[i]);
    }       
    printf("\n");   
    root = createTree(0,input,n);           
    inorder(root);
    return 0;
}

请立即查看您的输入。