Hi All,
I am writing a program for an assignment which uses binary trees to store a text file (a kind of maze):
1) Create a maze object which contains a binary tree of rows
2) Create a row object which contains a binary tree of maze points and a y value
3) Create a maze point object which contains a char attribute and an x value
This way, I should be able to traverse the file as if it was a 2D-Array, I think. I then have to run tests on it and print it out. But I am getting an error before I can even get as far as to run tests:
Here is my code so far below. The cpp file uses bintree.h and binnode.h, but note that I am not allowed to modify the header files.Code:binnode.h: In member function 'void binNode<dataType>::insert(const dataType&) [with dataType = mazePoint]': bintree.h:99: instantiated from 'void bintree<dataType>::insert(const dataType&) [with dataType = mazePoint]' assign3.cpp:82: instantiated from here binnode.h:58: error: no match for 'operator==' in '((binNode<mazePoint>*)this)->binNode<mazePoint>::nodeData == dataItem' binnode.h:62: error: no match for 'operator<' in 'dataItem < ((binNode<mazePoint>*)this)->binNode<mazePoint>::nodeData' binnode.h: In member function 'void binNode<dataType>::insert(const dataType&) [with dataType = mazeRow]': bintree.h:99: instantiated from 'void bintree<dataType>::insert(const dataType&) [with dataType = mazeRow]' assign3.cpp:129: instantiated from here binnode.h:58: error: no match for 'operator==' in '((binNode<mazeRow>*)this)->binNode<mazeRow>::nodeData == dataItem' binnode.h:62: error: no match for 'operator<' in 'dataItem < ((binNode<mazeRow>*)this)->binNode<mazeRow>::nodeData'
assign2.cpp:
bintree.h:Code:#include <iostream> #include <fstream> #include <ctype.h> #include <cstdlib> #include "bintree.h" #include "binnode.h" using namespace std; class mazePoint { private: int x; char point_type; public: mazePoint(); void setMazePoint(char point, int i); int get_potision(); }; class mazeRow { private: bintree<mazePoint> points; int y; public: mazeRow(); void setMazeRow(int row_number); void store_points(char ch, int i); int get_size(); void new_row(); void clear(); }; void load_maze(bintree<mazeRow> &maze, string arg); int main (int argc, char *argv[]) { bintree<mazeRow> maze; //Make sure a maze file was provided if (argc != 2) { cout << "Must supply 1 argument to this program\n"; return 0; } //Load and test the maze load_maze(maze, argv[1]); //If load successful, calculate and print solution // find_solution(maze); // print_solution(maze); //Cleanup // clear_rows(maze_rows); return 0; } void mazeRow::setMazeRow(int row_number) { y = row_number; } int mazeRow::get_size() { return points.size(); } void mazeRow::store_points(char ch, int i) { mazePoint point; point.setMazePoint(ch, i); points.insert(point); } void mazeRow::new_row() { y++; } void mazePoint::setMazePoint(char point, int i) { point_type = point; x=i; } int mazePoint::get_potision() { return x; } void load_maze(bintree<mazeRow> &maze, string arg) { string filein; mazeRow row; row.setMazeRow(1); ifstream fin; char ch; int i = 0; filein = arg; //open stream to filein fin.open(filein.c_str()); if (!fin) { cerr << "Unable to load maze " << filein << " \n"; exit(0); } while (!fin.eof()) { fin.get(ch); i++; row.store_points(ch, i); if(ch == '\n') { maze.insert(row); row.new_row(); } } fin.close(); //Run tests on the maze to make sure it is valid // if(test_maze(maze) == 0) // { // cout << "Unable to load maze " << filein << " \n"; // exit(0); // } }
binnode.h:Code:#ifndef BINTREE_H_ #define BINTREE_H_ #include <stdexcept> #include <math.h> #include "binnode.h" /********************************************************\ template class for a binary tree \********************************************************/ template <typename dataType> class bintree { private: binNode<dataType> *root; int numItems; public: /*******************************************************\ constructors & destructors \*******************************************************/ // constructor bintree() : root(NULL), numItems(0) {} // destructor ~bintree() { if (root != NULL) delete root; } /*******************************************************\ misc functions \*******************************************************/ bool empty() const { return (numItems == NULL); } int size() const { return numItems; } int numNodes() const { if (root == NULL) { return 0; } else { return root->numNodes(); } } int maxTreeDepth() const { if (root == NULL) { return 0; } else { return root->maxTreeDepth(); } } int numLeafNodes() const { if (root == NULL) { return 0; } else { return root->numLeafNodes(); } } double balance() const { // Returns a measure of how balanced a tree is. // A value of 1 is a prefectly balanced tree. // The closer to 0 the value is the more unbalanced // the tree. // A value < 0.5 indicates a tree that is seriously unbalanced if (numItems == 0) return 1.0; else return root->balance(); } void rebalance() { // Rebalance tree using the AVL algorithm // While this does not guarantee a perfectly balanced tree // it does make it mostly balanced by guranteeing that the diference // in depth between every right and left subtree is at most 1 if (root != NULL) { while (root->rebalance(root)); } } /*******************************************************\ insertion and erasure functions \*******************************************************/ void insert(const dataType& newData) { if (root == NULL) { root = new binNode<dataType>(newData); } else { root->insert(newData); } numItems++; } void erase(const dataType& delData) { if (root == NULL) { throw std::invalid_argument("data does not exist in tree to erase"); } root->erase(&root, delData); numItems--; } dataType* find(const dataType &findData) const { // this function looks for findData in the tree. // If it finds the data it will return the address of the data in the tree // otherwise it will return NULL if (root == NULL) return NULL; else return root->find(findData); } /*******************************************************\ print function for assignment. assumes dataType has print() function \*******************************************************/ void print() const { if (root != NULL) root->print(); } }; #endif
Code:#ifndef BINNODE_H #define BINNODE_H #include <math.h> #include <iostream> /********************************************************\ template node class for binary tree \********************************************************/ template <typename dataType> class binNode { private: dataType nodeData; binNode<dataType> *left, *right; void deleteNode(binNode<dataType> **root) { if (left == NULL && right == NULL) { // leaf node *root = NULL; } else if (left == NULL) { // right branch but no left branch *root = right; } else if (right == NULL) { // left branch but no right branch *root = left; } else { // has left and right branch binNode<dataType> *temp = right; // find left most node of right branch while (temp->left != NULL) temp = temp->left; // attach left branch to left side of right branch temp->left = left; // make root point to right branch *root = right; } left = NULL; right = NULL; delete (this); } public: // constructors binNode() : left(NULL), right(NULL) { } binNode(const dataType& dataItem) : nodeData(dataItem), left(NULL), right(NULL) { } // destructor ~binNode() { if (left != NULL) delete left; if (right != NULL) delete right; } void insert(const dataType& dataItem) { if (nodeData == dataItem) { throw std::invalid_argument("dataItem already in tree"); } if (dataItem < nodeData) { if (left == NULL) { left = new binNode(dataItem); } else { left->insert(dataItem); } } else { if (right == NULL) { right = new binNode(dataItem); } else { right->insert(dataItem); } } } void erase(binNode<dataType> **root, const dataType &delData) { if (delData == nodeData) { deleteNode(root); } else { if (delData < nodeData) { if (left == NULL) { throw std::invalid_argument("delItem not in tree"); } else { left->erase(&left, delData); } } else { if (right == NULL) { throw std::invalid_argument("delItem not in tree"); } else { right->erase(&right, delData); } } } } dataType* find(const dataType &findData) { if (findData == nodeData) { return &nodeData; } else if (findData < nodeData) { if (left == NULL) return NULL; else return left->find(findData); } else { if (right == NULL) return NULL; else return right->find(findData); } } bool rebalance(binNode<dataType>* &root) { // rebalance the subtrees hanging from this node int rnodes=0, lnodes=0, nodes, dif; bool rotate = false; if (left != NULL) { if (left->rebalance(left)) rotate = true; lnodes = left->numNodes(); } if (right != NULL) { if (right->rebalance(right)) rotate = true; rnodes = right->numNodes(); } if (rnodes > lnodes) { dif = rnodes - lnodes; // work out node difference if we rotate anticlockwise rnodes = 0; if (right != NULL && right->right != NULL) rnodes = right->right->numNodes(); nodes = 0; if (right != NULL && right->left != NULL) nodes = right->left->numNodes(); lnodes = 1 + lnodes + nodes; if (abs(lnodes - rnodes) < dif) { // rotate anticlockwise root = right; right = right->left; root->left = this; rotate = true; } } else if (lnodes > rnodes) { // work out node difference if we rotate clockwise dif = lnodes - rnodes; lnodes = 0; if (left != NULL && left->left != NULL) lnodes = left->left->numNodes(); nodes = 0; if (left != NULL && left->right != NULL) nodes = left->right->numNodes(); rnodes = 1 + rnodes + nodes; if (abs(lnodes - rnodes) < dif) { // rotate clockwise root = left; left = left->right; root->right = this; rotate = true; } } return rotate; } double balance() const { int lheight = 0, rheight = 0, dif; double bal = 1.0; if (left != NULL) { lheight = left->maxTreeDepth(); bal *= sqrt(left->balance()); } if (right != NULL) { rheight = right->maxTreeDepth(); bal *= sqrt(right->balance()); } dif = abs(lheight - rheight); if (dif <= 1) return bal; else return bal / log(dif); } // tree statistic functions int maxTreeDepth() const { int rdepth = 0, ldepth = 0; if (left != NULL) ldepth = left->maxTreeDepth(); if (right != NULL) rdepth = right->maxTreeDepth(); if (ldepth > rdepth) return 1 + ldepth; else return 1 + rdepth; } int numNodes() const { int size = 1; if (left != NULL) size += left->numNodes(); if (right != NULL) size += right->numNodes(); return size; } void print() const { if (left != NULL) left->print(); std::cout << nodeData.toString() << "\n"; if (right != NULL) right->print(); } int numLeafNodes() const { if (left == NULL && right == NULL) return 1; int numLeaf = 0; if (left != NULL) numLeaf += left->numLeafNodes(); if (right != NULL) numLeaf += right->numLeafNodes(); return numLeaf; } // overloaded dereference operator const dataType& operator * () const { return nodeData; } }; #endif



LinkBack URL
About LinkBacks



