我正在研究二叉搜索树,我看到了这段代码,我无法理解
// 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;
}
}
}
答案 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