[英]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.