在C中实现二叉搜索树的困难

时间:2014-04-05 21:21:30

标签: c data-structures

我已经尝试在C中实现二进制搜索树几个小时了,我将主要问题缩小到插入功能,您将在下面看到。似乎问题在于,当我将root设置为null,然后尝试插入时,它会一遍又一遍地创建根节点但没有任何变化(我得到了#34;形成根节点消息"好几次,遍历不起作用)。但是,当我取消注释行//root = newNode(3,NULL,NULL);并手动创建根节点时,我的所有插入工作正常,并且我的inorder遍历工作。我希望能够在我的函数中创建根节点,而不是像这样手动创建。这让我感到沮丧一段时间,所以任何帮助都会受到赞赏。谢谢!

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

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

struct node* newNode(int val, struct node* lchild, struct node* rchild) {
    struct node* temp = malloc(sizeof(struct node));
    if(temp == NULL) { printf("Error creating node! Exiting."); exit(1); }

    temp->key = val; 
    temp->left = lchild; 
    temp->right = rchild;
    return(temp);
}           

void add(int val, struct node* current) {
    if (current == NULL) {
        printf("forming root node\n");
        current = newNode(val,NULL,NULL);   
    } else if (val <= current->key) {
        if (current->left == NULL) {
            current->left = newNode(val, NULL, NULL);
        } else {
            add(val, current->left);            
        }
    } else {
        if (current->right == NULL) {
            current->right = newNode(val, NULL, NULL);
        } else {
            add(val, current->right);
        }
    }
}

void inOrder(struct node* current) {
    if (current != NULL) {
        inOrder(current->left);
        printf("%d ", current->key);
        inOrder(current->right);
    }
}

int main() {
    struct node* root = NULL;

    //root = newNode(3,NULL,NULL);
    add(3, root);
    add(2, root);
    add(4, root);
    add(16, root);
    inOrder(root);
}

3 个答案:

答案 0 :(得分:1)

C仅是按值传递。如果要从函数返回数据,则必须将指针传递给应修改的数据或将其返回。您的add() - 函数目前都没有。

我的建议是,使用返回值 可能的更正原型:

struct node* add(int val, struct node* current)
void add(int val, struct node** current)

答案 1 :(得分:1)

这是因为您按值传递根节点的值。在main()中,您创建一个节点*(root)并将其设置为NULL。这意味着root包含一个0的内存地址。问题是没有返回任何值,因此无论你在add()中做什么,root的值仍为NULL或0.当你手动创建一个根节点时,它因为add()可以在给定的地址处修改内存,并且根点的值在某处有意义所以这些更改仍然存在,但是当root为null时,add()所做的所有更改都会丢失。

答案 2 :(得分:1)

您希望修改 current指针,并将指针传递给它。

void add(int val, struct node **ptree);
{
    if(*ptree == NULL) {
        struct node *tmp = malloc(sizeof(*tmp));
        tmp->val = val; tmp->left = tmp->right = NULL;

        *ptree = tmp;
    }
    else if (val == (*ptree)->val)
        /* Scream about duplicate insertion */
    else if (val < (*ptree)->val)
        add(val, &((*ptree)->left));
    else /* val > (*ptree)->val */
        add(val, &((*ptree)->right));
 }

被称为例如add(42, &tree);如果tree是(将来)指向根的指针。