【问题标题】:Binary tree - not able to add values二叉树 - 无法添加值
【发布时间】:2017-01-07 18:56:18
【问题描述】:

在下面的程序中,我试图用数组 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;
}

【问题讨论】:

  • add()末尾分配一个新节点并返回指针是什么意思?

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


【解决方案1】:

您正在使用递归,因此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);
}

【讨论】:

  • 谢谢。我应该为此被绞死。
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多