插入二进制搜索树

时间:2016-11-10 02:01:26

标签: c++ binary-search-tree

我的老师在班级网站上发布了以下代码。我不理解它的工作原理。如果有人可以详细说明,那就太棒了。还有一件事,为什么她使用配对作为返回值,只使用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);
}

1 个答案:

答案 0 :(得分:1)

首先,您需要知道BST(二叉搜索树)的含义。

BST是一种用于搜索的数据结构。节点的值不会大于其左子节点的值,并且不会小于其右子节点的值。

然后,让我们谈谈您的教师代码。

完成这项工作有两大步骤。

  1. 找到要插入的节点的位置。 你老师的代码使用while循环来完成这项工作。

    node * t = root,* parent = null;

  2. 作为初始化,探针被分配给root。父项表示探测的父节点。如果为null,则表示探测是根节点。

    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的值,则插入失败。执行作业直到插入失败或探测为空,这意味着它到达叶节点。

    1. 插入节点。

      node * newNode = new node(val); newNode-&gt; parent = parent;
      if(!parent)     root = newNode; 否则if(parent-&gt; val&gt; val)     parent-&gt; left = newNode; 其他     parent-&gt; right = newNode;

    2. 创建新节点并将父节点分配给其父节点。 如果探测的父项为null,则表示在插入节点之前树是空的。因此,将新节点设置为root。 如果父级的值大于其值,则将其父级的子级分配给它。如果较小,请将正确的孩子分配给它。

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

      返回插入结果。

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