簡體   English   中英

插入二叉搜索樹

[英]Insertion in a Binary Search Tree

我的老師在班級網站上發布了以下代碼。 我不了解它的工作原理。 如果有人可以詳細說明,那就太好了。 還有一件事,為什么她用對作為返回值,而不是只用布爾值就夠了?

這是代碼:

template <class T>

std::pair<BST<T>::iterator, bool> BST<T>::insert(const T& val) {
    node<T>* t = root, *parent = null;

    while (t) {
        if (t->val == val)
            //return std::pair<BST<T>::iterator, bool>(iterator(t, this), false);    
            return std::make_pair(iterator(t, this), false); // stl convenience function

        parent = t;

        if (t->val > val) t = t->left;
        else if (t->val < val) t = t->right;
    }

    node<T>* newNode = new node<T>(val);  // (1) allocate memory
    newNode->parent = parent;             // (2) link child to parent

    //(3) link parent to child
    if (!parent) root = newNode;
    else if (parent->val > val) parent->left = newNode;
    else parent->right = newNode;

    return std::make_pair(iterator(newNode, this), true);
}

首先,您需要了解BST(二進制搜索樹)的含義。

BST是一種用於搜索的數據結構。 一個節點的值不會大於其左子節點的值,並且不會小於其右子節點的值。

然后,讓我們談談您的老師代碼。

要完成這項工作有兩個重要步驟。

  1. 找到要插入節點的位置。 您老師的代碼使用while循環來完成這項工作。

    節點* t =根,*父=空;

作為初始化,將探針分配給root。 父級是指探針的父級節點。 如果為空,則表示探針是根節點。

while (t) {
    if (t->val == val)   
        return std::make_pair(iterator(t, this), false);        
    parent = t;
    if (t->val > val) t = t->left;
    else if (t->val < val) t = t->right;
    }

比較您需要插入的值和探針的值。 如果插入值小於探測器的值,則將探測器分配給它的左子級。 如果更大,則將探針分配給其正確的子代。 如果等於探測器的值,則插入失敗。 進行作業,直到插入失敗或探針為空(這意味着它到達葉節點)為止。

  1. 插入節點。

    node * newNode =新的節點(val); newNode-> parent =父級;
    如果(!parent)root = newNode; 否則(parent-> val> val)parent-> left = newNode; 否則parent-> right = newNode;

創建一個新節點,並將父節點分配給它的父節點。 如果探針的父級為空,則表示在插入節點之前樹為空。 因此,將新節點設置為root。 如果父級的值大於其值,則為其分配父級的左子級。 如果較小,則為其分配合適的孩子。

return std::make_pair(iterator(newNode, this), true);

返回插入的結果。

您的最后一個問題。 我認為您的老師希望同時返回插入結果和該節點所在的節點。 如果結果為假,則表示存在與您要插入的值相同的值的節點。 因此,它將返回該節點所在的位置。 如果結果為true,則表示您已成功插入節點,並且返回的節點是您插入的節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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