// TREE.H: Definition of template class Tree #ifndef TREE_H #define TREE_H #include #include template class TreeNode { public: NODETYPE data; TreeNode(const NODETYPE &); // constructor NODETYPE getData() const; // return data NODETYPE *getDataPtr(); // return the pointer to data TreeNode *leftPtr; // pointer to left subtree TreeNode *rightPtr; // pointer to right subtree }; // constructor template TreeNode::TreeNode(const NODETYPE &d) { data = d; leftPtr = rightPtr = 0; } // Return a copy of the data value template NODETYPE TreeNode::getData() const { return data; } // Return a copy of the data value template NODETYPE *TreeNode::getDataPtr() { return &data; } template class Tree { public: Tree(); ~Tree(); TreeNode * insertNode(const NODETYPE &); void preOrderTraversal() const; TreeNode *findNode(const NODETYPE &); // set functions void ConvertToArray(NODETYPE **, int); // get counter int getcounter(); void freeMemory(void); private: void FREE(TreeNode*); TreeNode* rootPtr; int counter, id; // utility functions TreeNode* insertNodeHelper(TreeNode**, const NODETYPE &); TreeNode* findNodeHelper(TreeNode*, const NODETYPE &); void preOrderHelper(TreeNode*) const; void convertToarrayHelper(TreeNode* , NODETYPE **); }; template Tree::Tree() { rootPtr = 0; counter = 0; } template Tree::~Tree() { // if(counter==0||rootPtr==0) // return; // else // { // FREE(rootPtr); // delete rootPtr; // return; // } } template void Tree::freeMemory(void) { if(counter==0||rootPtr==0) return; else { FREE(rootPtr); delete rootPtr; return; } } template void Tree::FREE(TreeNode *P) { if(P->leftPtr!=NULL) { FREE(P->leftPtr); delete P->leftPtr; } if(P->rightPtr!=NULL) { FREE(P->rightPtr); delete P->rightPtr; } return; } template TreeNode * Tree::insertNode(const NODETYPE &value) { return insertNodeHelper(&rootPtr, value); } // This function receives a pointer to a pointer so the // pointer can be modified template TreeNode* Tree::insertNodeHelper(TreeNode **ptr, const NODETYPE &value) { if (*ptr == 0) { *ptr = new TreeNode(value); counter ++; return *ptr; } if (value < (*ptr)->data) return insertNodeHelper( &((*ptr)->leftPtr), value); return insertNodeHelper( &((*ptr)->rightPtr), value); } template TreeNode* Tree::findNode(const NODETYPE &value) { return findNodeHelper(rootPtr, value); } template TreeNode* Tree::findNodeHelper(TreeNode *ptr, const NODETYPE &value) { if (ptr == 0) return 0; if (value == ptr->data) return ptr; if (value < ptr->data) return findNodeHelper(ptr->leftPtr, value); return 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 int Tree::getcounter() { return counter; } template void Tree::ConvertToArray(NODETYPE **ndArray, int n) { if (counter != n) return; id = 0; convertToarrayHelper(rootPtr, ndArray); } template void Tree::convertToarrayHelper(TreeNode *ptr, NODETYPE **ndARRAY) { if (ptr != 0) { ndARRAY[id] = &(ptr->data); id ++; convertToarrayHelper(ptr->leftPtr, ndARRAY); convertToarrayHelper(ptr->rightPtr, ndARRAY); } } #endif