在C ++树数据结构中创建一个类

时间:2017-11-07 11:53:00

标签: c++ pointers constructor binary-search-tree

我在文件tree.h中有BinarySearchTree的代码:

#ifndef TREE_H
#define TREE_H

#include "treenode.h"


template <typename T>
class BinarySearchTree{
private:
  unique_ptr <TreeNode<T> > root;

public: 

  void write(ostream& os)const{
    root -> write(os);
  }

  TreeNode<T>* insert(T data){
    if (!root){
      root.reset(new TreeNode <T>(data));
      return root.get();
    } 

    TreeNode<T>* node = root.get();

    do {
      if ( node -> data < data) {
        if (node->rightChild)
          node = node -> rightChild.get();
        else {
          node -> setRightChild(new TreeNode<T>(data));
          return node -> rightChild.get();
        }
      }
      else if(data < node->data) {
        if (node->leftChild)
          node = node->leftChild.get();
        else {
          node->setLeftChild(new TreeNode<T>(data));
          return node->leftChild.get();
        }
      } else
        return node;

    }while(true);

    return nullptr;
  }

  TreeNode<T>* find (T data){

    if (!root) {
      return nullptr;
    }

    TreeNode<T>* node = root.get();

    do {
      if (node->data < data) {
        if (node->rightChild)
          node = node->rightChild.get();
        else {
          return nullptr;
        }
      }
      else if (data < node->data) {
        if (node->leftChild)
          node = node->leftChild.get();
        else {
          return nullptr;
        }
      } else
        return node;

    } while (true);

    return nullptr;
  }

};


#endif

我在treenode.h中也有一个TreeNode类:

  #ifndef TREENODE_H
#define TREENODE_H

#include <iostream>

using std::cout;
using std::cerr;
using std::endl;
using std::ostream;

#include <memory>
using std::unique_ptr;

#include <utility>
using std::pair;

template <typename T>
class TreeNode {

public:

  T data;
  unique_ptr <TreeNode> leftChild;
  unique_ptr <TreeNode> rightChild;
  TreeNode* parent;

  TreeNode (T d):parent(nullptr), data(d){
  }

  void setLeftChild(TreeNode* child){
     leftChild.reset (child);
     child -> parent = this;

  }

  void setRightChild(TreeNode* child) {
    rightChild.reset(child);
    child->parent = this;
  }
  void write(ostream& os)const{
    if(leftChild){
      leftChild -> write(os);
    }
    os << " ";
    os << data;
    os << " ";
    if(rightChild){
      rightChild -> write(os);
    }
  }

};

工作是创建一个模板类TreeNodeIterator - 二进制搜索树上的迭代器,它假设有:
 指向TreeNode的单个成员变量(可能更确切地说是BinarySearchTree?);
将此变量设置为给定TreeNode的构造函数;
重载运算符:* - 取消引用此指针并将其作为引用返回;
运算符'=='和'!='将其与其他迭代器进行比较;
并且运算符'++'以递增的顺序迭代节点。到目前为止,这个迭代器模板类应该在treenode.h中实现:

template <class E>
class TreeNodeIterator {
    public:

    E * tree;

    TreeNodeIterator (E * a){
        tree = a;
    } //constructor

    E& operator *(){
        return (*(this->tree));
    }
    bool  operator == (TreeNodeIterator<E>  t){
        if (this->tree == t.tree) return true;
        else 
            return false;
    }

    bool  operator != (TreeNodeIterator<E>  t){
        if (this->tree != t.tree) return true;
        else 
            return false;
        }

};

我还没有增量运算符,这是为了以后,在main方法中启动后,boolean似乎是OK,但看起来像'*'返回对TreeNodeIterator的引用,而不是BinarySearchTree节点应该 - 我将需要BinarySearchTree中的方法:
begin()和end() - 将迭代器返回到最左边的节点和nullptr 主要代码(编译和工作):

int main() {
    ostringstream s;
    BinarySearchTree<int> * tree10 = new BinarySearchTree<int>();
    BinarySearchTree<int> * tree11 = new BinarySearchTree<int>();
    tree10->insert(2);
    tree10->insert(3);
    tree10->insert(1);
    tree10->write(s);
    cout << s.str();
    tree11->insert(12);
    TreeNodeIterator<BinarySearchTree<int>> it0 (tree10);
    TreeNodeIterator<BinarySearchTree<int>> it1 (tree11);
     (it0.tree)->write(s);
     cout << s.str();
     if (it0 != it1) cout << "NO EQUAL";
        else cout << "EQUAL";
    return 0;
   }

但改变这一行时:

it0.tree->write(s

要:

*it0->write(s);

失败,告诉,操作数' - &gt;'没有指针类型,任何建议?此外,如何按升序迭代,看起来它不是前置或后序。感谢。

1 个答案:

答案 0 :(得分:0)

由于operator*运算符具有更高的优先级,因此您必须优先处理->与paranthesis的优先级。在您的情况下,编译器首先要评估it0->write(s)。这会导致错误。

更改行

*it0->write(s);

(*it0)->write(s);

编辑:

您的operator*正在返回引用而没有指针,因此您无需取消引用。尝试

(*it0).write(s);