C中的递归二叉树插入

时间:2016-08-16 17:27:31

标签: c binary-tree

所以我试图学习如何在C中创建一个二叉树到目前为止我已经有了这个。

void addRecordsToTree(struct date *in, struct date *root) {
    if (root == NULL) {
        root = malloc(sizeof(struct date));
        root = in;
        return;
    } else { 
        //Right side of tree processing
        if (compareTwoRecords(in, root) >= 0) {
            addRecordsToTree(in, root->right);
            return;
        } else {
            root->right = in;
            return;
        }
        //Left side of tree processing.
        if (compareTwoRecords(in, root) < 0) {
            addRecordsToTree(in, root->left);
            return;
        } else {
            root->left = in;
            return;
        }
    }
}

int main() {
    loadFiles();
    struct date treeRoot;
    struct date *old = malloc(sizeof(struct date));
    old = loadContentsIntoHeap(files[file2014]);

    addRecordsToTree(&old[0], &treeRoot);
    addRecordsToTree(&old[1], &treeRoot);
    addRecordsToTree(&old[2], &treeRoot);
    addRecordsToTree(&old[3], &treeRoot);
    addRecordsToTree(&old[4], &treeRoot);
    addRecordsToTree(&old[5], &treeRoot);

    printRecord(7, old);

    return 0;
}

问题是当我在调试器中检查程序的状态时,只有混乱的数据。我认为这可能是一个类型问题,我发现指针有点令人难以置信的概念。我不确定我是否使用过它们。所以这是调试器的屏幕截图。

debugger shot of last addRecordsToTree() call

正如您可以在底部的结构中看到的那样,旧的&#39;是我试图使树出来的数据和treeRoot是我试图放置它的地方,但我无法理解为什么我得到这些垃圾值。

还有什么是左右内存地址?我没有正确地创造它们。

我做的另一个观察是当我在调试器中看到我的代码时,似乎root永远不会== NULL并且永远不会被设置,为什么?

2 个答案:

答案 0 :(得分:1)

您刚刚执行了以下操作:

int x = 2;
int y = x;
y = 5;

第二行是必要的还是第三行。如果你这样做,这是一个完全不合逻辑的程序。你用指针而不是整数做了同样的事情。你首先有一个指向动态内存基地址的指针,然后你只是通过第二次初始化来覆盖它。

而且,与递归方法相比,迭代方法要好得多。我共享用于递归和迭代地在二叉树中插入节点的代码:

void insert(struct node *temp, struct node **root)
{
    while (*root != NULL)
        root = (*root)->element < temp->element ? &(*root)->left : &(*root)->right;
    *root = temp;
}

#if 0
/* Recursive approach */
void insert(struct node *temp, struct node **root)
{
    if(*root == NULL)
        *root = temp;
    else if ((*root)->element < temp->element)
        insert(temp, &(*root)->left);
    else
        insert(temp, &(*root)->right);
}
#endif

void create_node(int x, struct node **root)
{
    struct node *temp = (struct node *) malloc(sizeof(struct node));

    if (temp == NULL)
        printf("Unable to allocate memory. Free some space.\n");
    else
    {
        temp->left = NULL;
        temp->right = NULL;
        temp->element = x;
        insert(temp, root);
    }
}

int main()
{
    struct node *root = NULL;
    create_node(1, &root);
    create_node(2, &root);
    create_node(3, &root);
    return 0;
}

答案 1 :(得分:0)

我在你的&#34; addRecordsToTree&#34; -function中看到了一个额外的问题:

的IF块

&#34; //树处理的右侧&#34;

总是从函数返回。无论是&#34; IF&#34; -Expression是真还是假。 所以你永远不会插入你的左叶。因此,probalby应该检查/调试该功能。