插入在二叉搜索树

Insertion in a Binary Search Tree

本文关键字:搜索树 插入      更新时间:2023-10-16

我的老师在班级网站上发布了以下代码。我不明白这是怎么回事。如果有人能详细说明一下,那就太好了。还有一件事,为什么她使用pair作为返回值,只使用bool不够吗?

代码如下:

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循环来完成这项工作。

  2. 节点* t = root, *parent = null;

作为初始化,探针被分配给根节点。parent表示探测的父节点。如果为空,则表示探针是根节点。

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;
    }

比较需要插入的值和探针的值。如果插入值小于探针的值,则将探针分配给它的左子节点。如果它更大,则将探针分配给它的右子节点。如果等于probe的值,则插入失败。直到插入失败或探针为空,这意味着它到达了叶节点。

  • 插入节点

    node* newNode =新节点(val);newNode->parent = parent;
    如果父母(!)root = newNode;否则if (parent->val>val)parent->left = newNode;其他的

  • 创建一个新节点并将父节点分配给它的父节点。如果探测的父节点为空,这意味着在插入节点之前树是空的。因此将新节点设置为根节点。如果父节点的值大于它的值,则将父节点的左子节点赋值给它。

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

    返回插入的结果。

    最后一个问题。我认为你的老师希望返回插入的结果和节点所在的节点。如果结果为false,则意味着存在一个与您希望插入的值具有相同值的节点。所以它返回它所在的节点。如果结果为true,则意味着您成功插入了一个节点,并且它返回的节点就是您插入的节点。