在二叉搜索树中插入(C ++)

时间:2016-10-25 18:56:40

标签: c++ binary-search-tree

我是数据结构的新手。 我正在制作一个用于在二叉搜索树中插入元素的C ++程序。 程序编译时没有任何错误,但是当我运行程序时,在给出第一个输入n后,程序停止工作。 请帮助我使这个程序正常工作。

我的代码如下:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

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

struct node *root=NULL ,*par=NULL ,*pos=NULL,*save=NULL , *ptr=NULL ;
struct node* newNode(int data)
{
    struct node* newnode= (struct node*)malloc(sizeof(struct node));
    newnode->data=data;
    newnode->right=NULL; 
    newnode->left=NULL;
    return newnode;
}

void findpos(int data)
{
    if(root==NULL)
    {
        par=NULL,pos=NULL;
        return;
    }

    if(root->data==data)
    {
        par=NULL , pos=root;
        return;
    }

    if(data<root->data)
    {
        save=root; ptr=root->left; 
    }
    else{
        save=root; ptr=root->right;
    }
    while(ptr!=NULL)
    {
        if(ptr->data==data)
        {
            par=save; pos=ptr;
            return;
        }
        if(data<ptr->data)
        {
            save=ptr;
            ptr=ptr->left;
        }
        else{
            save=ptr;
            ptr=ptr->right;
        }
    }

    pos=NULL; par=save;
    return;
}


void insert(int data)
{
    findpos(data);
    if(pos!=NULL)
    {
        return;
    }
    pos=newNode(data);
    if(data<par->data)
    par->left=pos;

    else
    par->right=pos;

    return;
}



  int main()
    {
    struct node *root=  newNode(4);
    root->left=newNode(3);
    root->left->left=newNode(2);
    root->right=newNode(6);

    int n;
    cin>>n;
    insert(n);
    cout<<pos->data;  //just trying to see if it works
        return 0;
    }

2 个答案:

答案 0 :(得分:0)

main()中声明的根指针覆盖全局根指针。然后在第一个findpos(),根(全局)仍然是NULL。 所以,只需替换该代码:

int main()
{
    struct node *root=  newNode(4);
    root->left=newNode(3);
    root->left->left=newNode(2);
    root->right=newNode(6);

    int n;
    cin>>n;
    insert(n);
    cout<<pos->data;  //just trying to see if it works
    return 0;
}

通过这个:

int main()
{
    root=  newNode(4);
    root->left=newNode(3);
    root->left->left=newNode(2);
    root->right=newNode(6);

    int n;
    cin>>n;
    insert(n);
    cout<<pos->data;  //just trying to see if it works
    return 0;
}

答案 1 :(得分:0)

更改main方法,以便修改全局命名空间中的root;在root内声明名为main localy的新节点之前。

int main() {
    //      struct node *root = newNode(4); // you made this root a member of main.
    // not a global member anymore. 

                    root = newNode(4); // use this

            // Populate some nodes
                    root->left=newNode(3);
                    root->left->left=newNode(2);
                    root->right=newNode(6);

                    /* tree so far:
                     *              4       
                     *             / \
                     *            3   6
                     *           /
                     *          2
                     */


                    int n;
                    cin >> n;
                    cout << "user input " << n << "\n";

                    insert(n);
                    cout << pos->data;  //just trying to see if it works

                    return 0;
}