// TREE.H: Definition of template class Tree #ifndef TREE_H #define TREE_H #include #include #include "edge.h" #include "face.h" #include "treenode.h" template class Tree { public: Tree(); void insertNode(const NODETYPE &); void preOrderTraversal() const; TreeNode *findNode(const NODETYPE &); // set functions void setcounter(int ); void numberData(int ); void ConvertToArray(NODETYPE **, int); // get counter int getcounter(); private: TreeNode *rootPtr; TreeNode *tmpPtr; int counter; // utility functions void insertNodeHelper(TreeNode **, const NODETYPE &); void findNodeHelper(TreeNode *, const NODETYPE &); void preOrderHelper(TreeNode *) const; void numberDataHelper(TreeNode *, int ); void convertToarrayHelper(TreeNode *, NODETYPE **); }; template Tree::Tree() { rootPtr = 0; counter = 0; } template void Tree::insertNode(const NODETYPE &value) { insertNodeHelper(&rootPtr, value); } // This function receives a pointer to a pointer so the // pointer can be modified template void Tree::insertNodeHelper(TreeNode **ptr, const NODETYPE &value) { if (*ptr == 0) { *ptr = new TreeNode(value); assert(*ptr != 0); counter ++; } else if (value < (*ptr)->data) insertNodeHelper( &((*ptr)->leftPtr), value); else if (value > (*ptr)->data) insertNodeHelper( &((*ptr)->rightPtr), value); else return; } template TreeNode *Tree::findNode(const NODETYPE &value) { tmpPtr = 0; findNodeHelper(rootPtr, value); return tmpPtr; } template void Tree::findNodeHelper(TreeNode *ptr, const NODETYPE &value) { if (ptr == 0) return; if (value == ptr->data) { tmpPtr = ptr; return; } else { if (value < ptr->data) findNodeHelper(ptr->leftPtr, value); else findNodeHelper(ptr->rightPtr, value); } } template void Tree::preOrderTraversal() const { preOrderHelper(rootPtr); } template void Tree::preOrderHelper(TreeNode *ptr) const { if (ptr != 0) { ptr->data.print(); preOrderHelper(ptr->leftPtr); preOrderHelper(ptr->rightPtr); } } template void Tree::setcounter(int cnt) { counter = cnt; } template int Tree::getcounter() { return counter; } template void Tree::numberData(int bType) { numberDataHelper(rootPtr, bType); } template void Tree::numberDataHelper(TreeNode *ptr, int bType) { if (ptr == 0) return; if ((ptr->data).getbType() == bType) { if ((ptr->data).getcnt() == -1) { (ptr->data).setcnt(counter); counter ++; } } numberDataHelper(ptr->leftPtr, bType); numberDataHelper(ptr->rightPtr, bType); } template void Tree::ConvertToArray(NODETYPE **ndArray, int n) { if (counter != n) return; convertToarrayHelper(rootPtr, ndArray); } template void Tree::convertToarrayHelper(TreeNode *ptr, NODETYPE **ndARRAY) { int nn; if (ptr == 0) return; if ((ptr->data).getcnt() >= 0) { nn = (ptr->data).getcnt(); ndARRAY[nn] = &(ptr->data); } convertToarrayHelper(ptr->leftPtr, ndARRAY); convertToarrayHelper(ptr->rightPtr, ndARRAY); } #endif