簡體   English   中英

無法理解在二進制搜索樹中插入的邏輯

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM