繁体   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