// TREENODE.H // Definition of class TreeNode #ifndef TREENODE_H #define TREENODE_H template class TreeNode { friend class Tree; public: TreeNode(const NODETYPE &); // constructor NODETYPE getData() const; // return data private: TreeNode *leftPtr; // pointer to left subtree NODETYPE data; 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; } #endif ------ // TREE.H // Definition of template class Tree #ifndef TREE_H #define TREE_H #include #include #include "treenode.h" template class Tree { public: Tree(); void insertNode(const NODETYPE &); void preOrderTraversal() const; void inOrderTraversal() const; void postOrderTraversal() const; private: TreeNode *rootPtr; // utility functions void insertNodeHelper(TreeNode **, const NODETYPE &); void preOrderHelper(TreeNode *) const; void inOrderHelper(TreeNode *) const; void postOrderHelper(TreeNode *) const; }; template Tree::Tree() { rootPtr = 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) { // tree is empty *ptr = new TreeNode(value); assert(*ptr != 0); } else // tree is not empty if (value < (*ptr)->data) insertNodeHelper( &((*ptr)->leftPtr), value); else if (value > (*ptr)->data) insertNodeHelper(&((*ptr)->rightPtr), value); else cout << value << " dup" << endl; } template void Tree::preOrderTraversal() const { preOrderHelper(rootPtr); } template void Tree::preOrderHelper(TreeNode *ptr) const { if (ptr != 0) { cout << ptr->data << ' '; preOrderHelper(ptr->leftPtr); preOrderHelper(ptr->rightPtr); } } template void Tree::inOrderTraversal() const { inOrderHelper(rootPtr); } template void Tree::inOrderHelper(TreeNode *ptr) const { if (ptr != 0) { inOrderHelper(ptr->leftPtr); cout << ptr->data << ' '; inOrderHelper(ptr->rightPtr); } } template void Tree::postOrderTraversal() const { postOrderHelper(rootPtr); } template void Tree::postOrderHelper(TreeNode *ptr) const { if (ptr != 0) { postOrderHelper(ptr->leftPtr); postOrderHelper(ptr->rightPtr); cout << ptr->data << ' '; } } #endif ------ // Driver to test class Tree #include #include #include "tree.h" main() { Tree intTree; int intVal; cout << "Enter 10 integer values:" << endl; for(int i = 0; i < 10; i++) { cin >> intVal; intTree.insertNode(intVal); } cout << endl << "Preorder traversal" << endl; intTree.preOrderTraversal(); cout << endl << "Inorder traversal" << endl; intTree.inOrderTraversal(); cout << endl << "Postorder traversal" << endl; intTree.postOrderTraversal(); Tree floatTree; float floatVal; cout << endl << endl << endl << "Enter 10 float values:" << endl << setiosflags(ios::fixed | ios::showpoint) << setprecision(1); for(i = 0; i < 10; i++) { cin >> floatVal; floatTree.insertNode(floatVal); } cout << endl << "Preorder traversal" << endl; floatTree.preOrderTraversal(); cout << endl << "Inorder traversal" << endl; floatTree.inOrderTraversal(); cout << endl << "Postorder traversal" << endl; floatTree.postOrderTraversal(); return 0; }