插入二叉搜索树

时间:2018-06-19 19:25:25

标签: c pointers tree malloc binary-search-tree

我做了一个二叉搜索树

struct BTNode
{
    int info;
    struct BTNode *left,*right;
};

我已经写了一个代码在树中插入一个节点

void insert(struct BTNode *root,int data)
{
    struct BTNode *ptr;
    struct BTNode *n=malloc(sizeof(struct BTNode));
    n->info=data;
    n->left=NULL;
    n->right=NULL;
    if(root==NULL)
    root=n;
    else{
    ptr=root;
    while(ptr!=NULL){
        if(data<ptr->info){
            if(ptr->left==NULL)
            ptr->left=n;
            else
            ptr=ptr->left;
        }
        else if(data>ptr->info){
            if(ptr->right==NULL)
            ptr->right=n;
            else
            ptr=ptr->right;
        }
    }
    }
}

和main()函数

int main()
{
    struct BTNode *root=NULL;
    int choice,data;
    printf("\n1.Insert 2.Preorder 3.Exit\n");
    scanf("%d",&choice);
    switch(choice){
        case 1:
        printf("\nWrite the data: ");
        scanf("%d",data);
        insert(root, data);
        break;

但是当我尝试插入节点时,我的程序崩溃了。有什么提示吗?

2 个答案:

答案 0 :(得分:0)

如果您希望能够更改根指针指向的位置,则应该传递一个指向根指针的指针(对不起,如果有点费解的话)。

您想要的是这样的东西:

void insert(struct BTNode **root,int data)
{
...
    if(*root == NULL) {
        *root = n;
    }
...
}

然后在调用它时,会将地址传递给根指针:

int main()
{
    struct BTNode *root=NULL;
    int data;
    ...
    scanf("%d", &data);
    insert(&root, data);
    ...
}

还要注意以上几点:您应该将变量的地址传递给scanf。也许这只是您输入的错字,因为您使用choice变量正确地做到了。

答案 1 :(得分:0)

就像其他人所说的那样,修改作为参数的指针不会对方法产生任何影响。

C通过值而不是通过引用传递指针。意味着您要在函数中处理的指针是仅指向同一事物的不同指针。您必须将指针传递给类似我上面答案的指针。

我希望我能评论一下这个解释,但是我想我需要信誉才能做到这一点。