[英]Unable to understand logic in insertion in 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;
}
}
}
在二叉搜索树中,左子级具有比父级更低的值,右子级具有比父级更高的值。 然后,如果要插入新节点,则必须找到他的站点。 当树的节点的值小于num时 ,您可以向右导航树。 当一个节点的值大于num时,将树导航到左侧,而不是右侧。 这是循环,直到您到达NULL节点为止,该节点将成为新节点的num值。
在此代码块中。
prev指针将根据num的值遍历整棵树后指向叶节点。
temp为NULL,因此已使用malloc分配了空间,以便它可以容纳值为num的节点。
现在,如果num的值大于其父级的值,即prev-> a,则temp将成为prev的正确子级。
如果num的值大于其父级(即prev-a)的值,则temp将成为prev的左子级。
就在您不了解的代码上方,该程序沿树向左或向右移动。 当num
小于在节点temp
处存储的值时,探索将在左分支继续,否则它将在右分支继续。 在此过程中,它将跟踪prev
,它是temp
的父节点。
当temp
为null时,搜索结束。 这意味着我们想要去的左分支或右分支没有附加节点。 这是必须插入num
地方。
然后,它创建一个名为temp
的新节点,将num
存储在其中。 请注意,这里有一个小错误。 一个不应该转换malloc
的返回值。 此malloc有效,但被认为是不良做法。
然后,它重新测试,如果该节点必须作为父节点的左或右分支被连接prev
并相应地将其固定。 这是您不理解的代码。
此代码中有一个严重的错误,因为新节点的左右分支具有未定义的值。
temp = (struct node *)malloc(sizeof(struct node));
temp->a = num;
temp->right = temp->left = NULL; // <-- missing instruction
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.