针对红黑树的 const_iterator& operator++() 错误

bugged const_iterator& operator++() for red-black tree

提问人:mpv 提问时间:9/15/2022 更新时间:9/15/2022 访问量:77

问:

我是 c++ 的新手,我在模板类 Tree 上实现迭代器时遇到了一些问题(代码结构包括规范类(Node、Tree、Iterator)。

Fwd 迭代器在主要测试(使用以下摘录)时无法正常工作:

  //expected result: 16 | 20 | 61 | 65 | 71 | 76 | 81 | 85 | 90 | 93 | 101 |
  
  auto it{rbt.begin()};
  auto end{rbt.end()};
  std::cout << *it << std::endl; // works fine=16
  std::cout << *end // works fine = set to nullptr, returns 0

  while(it!=end) {
    std::cout << *it << std::endl; 
    it++;
  } 

//getting alternatively the following errors when trying different solutions:
//A- just |16| and then iterator stops
//B- overflowing with |16|16|16|16|16|16|16|16|16|16|16 never stopping
//C- overflowing with |16|0|16|0|16|0|16|0|16|0|16|0|16 never stopping
//D- segmentation fault core (dump)

我想这是由于树的创建方式,特别是将一些帮助程序“NIL”(指向已初始化但空节点的指针)存活在内存中的事实。 它们对于其他 Tree 方法(如插入/删除)是必需的,但据我所知,它们会干扰迭代器的正确功能,而不是简单地跳过它们,而是卡在某个地方。 我尝试自己更改运算符++()的主要条件: 从

if(current_node->right!=nullptr)

if(current_node->right!=NIL)

在迭代器类中,但我收到“无效使用非静态数据成员'RBTree::NIL'”错误,我不知道该怎么做才能修复它,让 Tree 的 NIL 私有成员在迭代器中也可见。 以下是有关类的更多详细信息以及包含完整代码的链接

template <class T, class CMP>> 
class Tree {

public:
  typedef T node_type;
  typedef _Node<node_type> Node; ///< type of template tree node.
  typedef Node *NodePtr; ///< type of pointer to template tree node.

  class const_iterator;

private:
  NodePtr root;
  NodePtr NIL; ///< empty node, probable cause of the problem

摘自 Iterator 类:

    template <class T, class CMP> 
    class RBTree<T, CMP>::const_iterator {
      friend class RBTree;
    
    private:
      NodePtr current_node;
    
    public:
      const_iterator& operator++() { // this is the method causing issues
        if(current_node->right!=nullptr) {
          current_node = current_node->right->leftmost();
        }
        else {
          current_node = current_node->rightmost();
        }
        return *this;
}

最后是 Node 类:

template <class T> 
class _Node {
public:
  friend class const_iterator; //allows const_iterator using leftmost() and rightmost()

  T data;                      //key
  Color color;                 //color
  _Node *left, *right, *parent; ///< pointers to parent, left and right children.

  //Default Constructor of a RBTree's node.
  _Node() {}

  _Node(T key, Color clr=BLACK, _Node *parent=nullptr) : data{key}, color{clr}, left{nullptr}, right{nullptr}, parent{parent} {}

  ~_Node() noexcept {}


  _Node* leftmost() noexcept {
    if(left!=nullptr) {
      return left->leftmost();
    }
    return this;
  }


  _Node* rightmost() const {
    if(parent!=nullptr) {
      if(parent->right==this) {
        return parent->rightmost();
      }
    }
      return parent;
  }

如果您想帮助我理解和改进我的代码,请提前感谢您:我知道周围可能还有很多其他错误,所以请提供任何建议,这是我提高技能的一种方式。

C++ 二进制树 悬空指针常 量迭代器

评论


答: 暂无答案