无法理解二进制搜索树中插入的逻辑

时间:2015-04-26 13:24:33

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

我正在研究二叉搜索树,我看到了这段代码,我无法理解

// head是根节点& num是关键元素

void generate(struct node **head, int num)
{
    struct node *temp = *head, *prev = *head;
    if (*head == NULL)
    {
        *head = (struct node *)malloc(sizeof(struct node));
        (*head)->a = num;
        (*head)->left = (*head)->right = NULL;
    }
    else
    {
        while (temp != NULL)
        {
            if (num > temp->a)
            {
                prev = temp;
                temp = temp->right;
            }
            else
            {
                prev = temp;
                temp = temp->left;
            }
        }
        temp = (struct node *)malloc(sizeof(struct node));
        temp->a = num;

//我无法理解以下几行

        if (num >= prev->a)
        {
            prev->right = temp;
        }
        else
        {
            prev->left = temp;
        }
    }

}

3 个答案:

答案 0 :(得分:0)

在二叉搜索树中,左子项的值低于父项,右子项的值高于父项。然后,如果要插入新节点,则必须找到他的站点。虽然树的节点值小于 num ,但您可以将树导航到右侧。当一个节点的值高于num时,您将树导航到左侧,而不是右侧。这是循环,直到您到达NULL节点,该节点将是值为 num 的新节点的位置。

答案 1 :(得分:0)

在此代码块中。

prev指针将根据 num 的值遍历整个树后指向叶节点。

temp 为NULL,因此使用malloc分配空间,以便它可以将值保存为 num 的节点。

现在,如果num的值大于其父级的值,即prev-> a, temp 将成为prev的正确子级。

如果num的值大于其父级的值,即prev-a,则 temp 将成为prev的子级。

答案 2 :(得分:0)

在您不理解的代码上方,程序正在向左或向右移动树。当num小于存储在节点temp的值时,探测将在左分支上继续,否则它将继续在右分支上。在此过程中,它会跟踪prev,它是temp的父节点。

temp为空时,搜索结束。这意味着没有节点连接到我们想去的左或右分支。这是必须插入num的地方。

然后创建一个名为temp的新节点,将num存储在其中。 请注意,这里有一个小错误。不应该强制转换malloc的返回值。这个malloc有效,但它被认为是不好的做法。

然后重新测试节点是否必须作为父节点prev的左或右分支附加并相应地附加它。这是您不理解的代码。

此代码中存在错误,因为新节点具有左右分支的未定义值。

temp = (struct node *)malloc(sizeof(struct node));
temp->a = num;
temp->right = temp->left = NULL;  // <-- missing instruction