/**************************************************************************************** * Program Name: lab3333_1_head.h * Author: Zhixiang Chen * Course: CSCI/CMPE 3333, Fall 2014 * Lab 1: Header file for Lab 1 * Date: August, 2014 * Description: This file contains the prototype of the class template binarySearchTree *****************************************************************************************/ #ifndef H_BST #define H_BST #include #include #include using namespace std; template class binarySearchTree; //forward declaration template class binarySearchTreeNode { public: friend class binarySearchTree; //constructor binarySearchTreeNode(const Type & info, binarySearchTreeNode *lp, binarySearchTreeNode *rp) :element(info), left(lp), right(rp){ }; private: Type element; //store info binarySearchTreeNode *left; //left child node pointer binarySearchTreeNode *right; //right child node pointer }; template class binarySearchTree { public: //default constructor explicit binarySearchTree(); //copy constructor binarySearchTree(const binarySearchTree & rhs); //destructor ~binarySearchTree(); binarySearchTreeNode * findMin() const; //find minimum element in the tree binarySearchTreeNode * findMax() const; //find maximum element in the tree bool find (const Type & x) const; //find x in the tree or not bool isEmpty(); //check if the tree is empty or not void destroyTree(); //delete the tree void insert(const Type & x); //insert x into the tree void remove(const Type & x); //remove x from the tree //overload operator = const binarySearchTree & operator=(const binarySearchTree & rhs); //tree traversal void inOrderTraversal(); //print tree in in-order void preOrderTraversal(); //print tree in pre-order void postOrderTraversal(); //print tree in post-order int treeHeight(); //get the height of the tree int treeNodeCount(); //get the node count (size) of the tree int treeLeaveCount(); //get the leave count of the tree protected: binarySearchTreeNode * root; //auxillary methods private: //copy tree rhs to rt binarySearchTreeNode * copyTree(binarySearchTreeNode * & rt, binarySearchTreeNode *rhs); //delete tree p void destroyTree(binarySearchTreeNode * & p); //insert x into tree p void insert(binarySearchTreeNode * & p, const Type & x); //remove x from tree p void remove(binarySearchTreeNode * & p, const Type & x); //inorder traveral tree p void inOrderTraversal(binarySearchTreeNode * p); //preorder traveral tree p void preOrderTraversal(binarySearchTreeNode * p); //postorder traveral tree p void postOrderTraversal(binarySearchTreeNode * p); //get height of tree p int treeHeight(binarySearchTreeNode * p); //get node count of tree p int treeNodeCount(binarySearchTreeNode * p); //get leave count of tree p int treeLeaveCount(binarySearchTreeNode * p); //find min of tree p binarySearchTreeNode * findMin(binarySearchTreeNode *p) const; //find max of tree p binarySearchTreeNode * findMax(binarySearchTreeNode *p) const; //find x in tree p bool find(const binarySearchTreeNode *p, const Type & x) const; int larger (int x, int y); }; //default constructor template binarySearchTree::binarySearchTree() { root = NULL; } //copy constructor template binarySearchTree::binarySearchTree(const binarySearchTree & rhs) { if (this != & rhs) { root = copyTree(root, rhs.root);//actual copy } } //destructor template binarySearchTree::~binarySearchTree() { destroyTree(); } //find minimum element in the tree template binarySearchTreeNode * binarySearchTree::findMin() const { return findMin(root); } //find maximum element in the tree template binarySearchTreeNode * binarySearchTree::findMax() const { return findMax(root); } //find x in the tree or not template bool binarySearchTree::find (const Type & x) const { return find (root, x); } //check whether the tree is empty or not template bool binarySearchTree::isEmpty() { return root == NULL; } //delete the tree template void binarySearchTree::destroyTree() { destroyTree(root); } //insert x into the tree template void binarySearchTree::insert(const Type & x) { insert(root, x); } //remove x from the tree template void binarySearchTree::remove(const Type & x) { remove(root, x); } //overload operator = template const binarySearchTree & binarySearchTree::operator=(const binarySearchTree & rhs) { if (this != &rhs) copyTree(root, rhs); return this; } //print tree in in-order template void binarySearchTree::inOrderTraversal() { inOrderTraversal(root); } //print tree in pre-order template void binarySearchTree::preOrderTraversal() { preOrderTraversal(root); } //print tree in post-order template void binarySearchTree::postOrderTraversal() { postOrderTraversal(root); } //get the height of the tree template int binarySearchTree::treeHeight() { return treeHeight(root); } //get the node count (size) of the tree template int binarySearchTree::treeNodeCount() { return treeNodeCount(root); } //get the leave count of the tree template int binarySearchTree::treeLeaveCount() { return treeLeaveCount(root); } /***************************************************************** auxillary functions *****************************************************************/ //copy tree rhs to rt template binarySearchTreeNode * binarySearchTree::copyTree(binarySearchTreeNode * & rt, binarySearchTreeNode *rhs) { if (rt != NULL) destroty(rt); if (rhs == NULL) { rt = NULL; } else { rt = new binarySearchTreeNode(rhs->info, copyTree(rt->left, rhs->left), copyTree(rt->right, right->right)); } return rt; } //delete tree p template void binarySearchTree::destroyTree(binarySearchTreeNode * & p) { binarySearchTreeNode * tmp; tmp = p; if (p!=NULL) { destroyTree(p->left); destroyTree(p->right); delete p; } } //insert x into tree p template void binarySearchTree::insert(binarySearchTreeNode * & p, const Type & x) { if (p == NULL) p = new binarySearchTreeNode(x, NULL, NULL); else if (p->element <= x) insert(p->right, x); else insert(p->left, x); } //remove x from tree p template void binarySearchTree::remove(binarySearchTreeNode * & p, const Type & x) { binarySearchTreeNode * tmp; //if tree is empty do nothing if (p==NULL) return; if (x < p->element) remove(p->left, x); //remove x from left subtree else if (x > p->element) remove (p->right, x); //romve x from right subtree else //remove the curent node containing x { //p have no children or only one child if (p->left == NULL || p->right == NULL) { tmp = p; p = (p->left == NULL)? p->right: p->left; delete tmp; } else //p has two children { p->element = findMin(p->right)->element; remove(p->right, p->element); } } } //inorder traveral tree p template void binarySearchTree::inOrderTraversal(binarySearchTreeNode * p) { if (p != NULL) { inOrderTraversal(p->left); cout<< p->element <right); } } //preorder traveral tree p template void binarySearchTree::preOrderTraversal(binarySearchTreeNode * p) { if (p != NULL) { cout<< p->element <left); preOrderTraversal(p->right); } } //postorder traveral tree p template void binarySearchTree::postOrderTraversal(binarySearchTreeNode * p) { if (p != NULL) { postOrderTraversal(p->left); postOrderTraversal(p->right); cout<< p->element < int binarySearchTree::treeHeight(binarySearchTreeNode * p) { if (p==NULL) return -1; else return 1 + larger(treeHeight(p->left), treeHeight(p->right)); } //get node count of tree p template int binarySearchTree::treeNodeCount(binarySearchTreeNode * p) { if (p==NULL) return 0; else return 1 + treeNodeCount(p->left) + treeNodeCount(p->right); } //get leave count of tree p template int binarySearchTree::treeLeaveCount(binarySearchTreeNode * p) { if (p == NULL) return 0; else if (p->left == NULL && p->right == NULL) return 1; else if (p->left == NULL ) return treeLeaveCount(p->right); else if (p->right == NULL) return treeLeaveCount(p->left); else return treeLeaveCount(p->left) + treeLeaveCount(p->right); } //find min of tree p template binarySearchTreeNode * binarySearchTree::findMin(binarySearchTreeNode *p) const { if (p == NULL) return NULL; else if (p->left == NULL) return p; else return findMin(p->left); } //find max of tree p template binarySearchTreeNode * binarySearchTree::findMax(binarySearchTreeNode *p) const { if (p == NULL) return NULL; else if (p->right == NULL) return p; else return findMin(p->right); } //find x in tree p template bool binarySearchTree::find(const binarySearchTreeNode *p, const Type & x) const { if (p == NULL) return false; else if (p->element == x) return true; else if (x < p->element) return find(p->left, x); else return find (p->right, x); } template int binarySearchTree::larger(int x, int y) { return (x >= y)? x : y; } #endif