二进制搜索树中的插入失败

时间:2018-06-19 21:17:11

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

这是我用于创建和插入二进制搜索树的代码

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

struct BTNode* create(int data)
{
    struct BTNode *root;
    struct BTNode *n = malloc(sizeof(struct BTNode));

    n->info = data;
    n->left = NULL;
    n->right = NULL;
    root = n;

    return(root);
}

struct BTNode* insert(struct BTNode *root, int data)
{
    struct BTNode *ptr;
    struct BTNode *n = malloc(sizeof(struct BTNode));
    if (n == NULL)
        printf("\nOUT OF MEMORY!\n");

    n->info = data;
    n->left = NULL;
    n->right = NULL;


    ptr = root;
    while (ptr != NULL){
        if (data < ptr->info){
            if (ptr->left == NULL)
            ptr->left = n;

            ptr = ptr->left;
        }
        else if (data > ptr->info){
            if (ptr->right == NULL)
            ptr->right = n;

            ptr = ptr->right;
        }
    }

    return(n);
}

这是main()函数

int main()
{
    struct BTNode *root = NULL;
    int choice, data;

    printf("\nWrite the root data: ");
    scanf("%d", &data);
    root = create(data);

    while (1){
    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;

我能够创建根节点,但是每当我尝试插入数据时,我都会给我数据,而编译器将停止执行任何操作。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您的while()循环将永远持续下去,因为即使在找到插入节点的位置之后,您仍会继续循环:

while(ptr!=NULL){
    if(data<ptr->info){
        if(ptr->left==NULL)
        ptr->left=n;

        ptr=ptr->left;
    }
    else if(data>ptr->info){
        if(ptr->right==NULL)
        ptr->right=n;

        ptr=ptr->right;
    }
}

插入节点后,您需要跳出while()循环:

while (ptr != NULL) {
    if (data < ptr->info) {
        if (ptr->left == NULL) {
            ptr->left = n;
            break;
        }


        ptr = ptr->left;
    } else if (data > ptr->info) {
        if (ptr->right == NULL) {
            ptr->right = n;
            break;
        }


        ptr = ptr->right;
    }
}

此外,用于检查malloc()是否失败的奖励积分

struct BTNode *n = malloc(sizeof(struct BTNode));
if (n == NULL)
    printf("\nOUT OF MEMORY!\n");

但是无论如何简单地继续执行,负点应该在malloc()失败的情况下退出函数

struct BTNode *n = malloc(sizeof(struct BTNode));
if (n == NULL) {
    printf("\nOUT OF MEMORY!\n");
    return NULL:
}

然后,当然,调用insert()的代码应该知道如果insert()返回NULL时该怎么做。