[英]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是一種用於搜索的數據結構。 一個節點的值不會大於其左子節點的值,並且不會小於其右子節點的值。
然后,讓我們談談您的老師代碼。
要完成這項工作有兩個重要步驟。
找到要插入節點的位置。 您老師的代碼使用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;
}
比較您需要插入的值和探針的值。 如果插入值小於探測器的值,則將探測器分配給它的左子級。 如果更大,則將探針分配給其正確的子代。 如果等於探測器的值,則插入失敗。 進行作業,直到插入失敗或探針為空(這意味着它到達葉節點)為止。
插入節點。
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.