segmentation fault in height balance tree code

74 views Asked by At

When i try to do like this:

int main(){

    node * root;

    insert(&root, 10);
    insert(&root, 20);
    insert(&root, 30);
    insert(&root, 40);
    insert(&root, 50);
    insert(&root,60);

    preorder(root);

return 0;
}

my code runs fine and gives output.

But when i do this:

int main(){

    node * root;

    insert(&root, 10);
    insert(&root, 20);
    insert(&root, 30);
    insert(&root, 40);
    insert(&root, 50);
    insert(&root,60);

    preorder(root);

    node * t;

    insert(&t,9);
    insert(&t,15);
    insert(&t,18);
    insert(&t,33);
    insert(&t,55);
    insert(&t,44);
    insert(&t,61);

return 0;
}

It gives a segmentation fault...

Also if i comment:

preorder(root);

the code just works fine..

If i do the preorder of node t at last it works fine... Don't know how i am getting this segmentation error when i try to print the preorder of root before t?

Code segment for insert:

void insert(node ** root, int d){
    node * t= *root;

    *root=_insert(t,d);
}

node * _insert(node * t, int d){
    if(t==NULL)
        return newNode(d);
    else{

        if(d < t->data)
            t->left=_insert(t->left,d);

        if(d > t->data)
            t->right=_insert(t->right,d);

        t->height= max(ht(t->left),ht(t->right))+1;

        int bal= ht(t->left)-ht(t->right);

        if(bal > 1 && d < t->data)
            return rightRotate(t);

        if(bal < -1 && d > t->data)
            return leftRotate(t);

        if(bal < -1  && d > t->data){
            t->right=rightRotate(t->right);
            return leftRotate(t);
        }   

        if(bal >1 && d < t->data){
            t->left=leftRotate(t->left);
            return rightRotate(t);
        }

        return t;
    }
}

Code segment of preorder:

void preorder(node * t){
    if(t==NULL)
        return;

    else {
        cout<<t->data<<" ";
        preorder(t->left);
        preorder(t->right);
    }
}

Helper functions used in code and node structure:

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


node * newNode(int d){
    node * t;
    t= new node;
    t->data = d;
    t->left=NULL;
    t->right=NULL;
    t->height=1;
    return t;
}


int ht(node * t){
    if(t==NULL)
        return 0;
    else
        return t->height;
}

node * leftRotate(node * t){
    node * y = t->right;
    t->right= y->left;
    y->left=t;

    return y;
}


node * rightRotate(node * t){
    node * y = t->left;
    t->left= y->right;
    y->right=t;

    return y;
}
1

There are 1 answers

1
Some programmer dude On BEST ANSWER

You have undefined behavior in your code, because local variables are not initialized, their values are indeterminate.

You need to initialize the variables before you try to use them, e.g.

node* root = nullptr;  // or `0` or `NULL`