我在文件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;'没有指针类型,任何建议?此外,如何按升序迭代,看起来它不是前置或后序。感谢。
答案 0 :(得分:0)
由于operator*
运算符具有更高的优先级,因此您必须优先处理->
与paranthesis的优先级。在您的情况下,编译器首先要评估it0->write(s)
。这会导致错误。
更改行
*it0->write(s);
到
(*it0)->write(s);
编辑:
您的operator*
正在返回引用而没有指针,因此您无需取消引用。尝试
(*it0).write(s);