二叉树 - 无法添加值

时间:2017-01-07 18:56:18

标签: c algorithm data-structures binary-search-tree

在下面的程序中,我尝试使用数组arr中的值填充BST。该程序似乎在循环中运行了很长时间,然后我得到一个分段错误。有人可以解释我在这里缺少的东西吗?

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

void add(struct node **root, int i);
int arr[14] = {30, 50, 25, 32, 45, 55, 20, 27, 31, 43, 47, 52, 88};

int main(void)
{
        struct node *root = malloc(sizeof(struct node));
        root->value = 35;
        root->left = NULL;
        root->right = NULL;

        struct node *start = root;
        int i;

        for (i = 0; i < 13; i++) {
                add(&root, arr[i]);
                root = start;
        }

        printf("%d\n", root->value);
        printf("%p\n", root->right);
        printf("%p\n", root->left);
}

void add(struct node **root, int i)
{
        while ((*root) != NULL) {
                printf("left: %p\n", (*root)->left);
                if (i < (*root)->value) {
                        add(&((*root)->left), i);
                } else {
                        add(&((*root)->right), i);
                }
        }
        *root = malloc(sizeof(struct node));
        (*root)->value = i;
        (*root)->left = NULL;
        (*root)->right = NULL;
}

1 个答案:

答案 0 :(得分:3)

你正在使用递归,所以while没有理由在那里。它应该是一个if-else逻辑结构:

void add(struct node **root, int i)
{
    if (*root)
    {
        if (i < (*root)->value) {
            add(&((*root)->left), i);
        } else {
            add(&((*root)->right), i);
        }
    }
    else
    {
        *root = malloc(sizeof(struct node));
        (*root)->value = i;
        (*root)->left = NULL;
        (*root)->right = NULL;
    }
}

如果目标是消除递归,那么解决方案是使用while循环,但将root向下移动直到它解决空节点:

void add(struct node **root, int i)
{
    while(*root)
    {
        if (i < (*root)->value) {
            root = &(*root)->left;
        } else {
            root = &(*root)->right;
        }
    }
    *root = malloc(sizeof(struct node));
    (*root)->value = i;
    (*root)->left = NULL;
    (*root)->right = NULL;
}

最后,main中的for循环不必要地重复root。正确完成该循环应该看起来像这样(假设目标是主机数组中的值):

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

    int i;
    for (i = 0; i < 13; i++)
        add(&root, arr[i]);

    printf("%d\n", root->value);
    printf("%p\n", root->right);
    printf("%p\n", root->left);
}