#ifndef ___BINARY__TREE__ #define ___BINARY__TREE__ #include #include template class btree { private: T data; bool empty; btree* left, * right; public: btree() { empty = true; left = right = NULL; } btree(const T& elem) { data = elem; empty = false; left = right = NULL; } btree(const btree& tree2); // copy constructor ~btree(); void swap(btree& tree2); void binsert(const T& elem); bool find(T& elem); void inorder(std::ostream& out); void preorder(std::ostream& out); void postorder(std::ostream& out); }; template void btree::swap(btree& tree2) { T tmp_data = data; data = tree2.data; tree2.data = tmp_data; // left subtree btree* tmp_ptr = left; left = tree2.left; tree2.left = tmp_ptr; // right subtree btree* tmp_ptr = right; right = tree2.right; tree2.right = tmp_ptr; } template void btree::binsert(const T& elem) { if (empty == true) { data = elem; empty = false; return; } if (elem <= data) // elem should be inserted into the left subtree { if (left == NULL) { left = new btree(elem); } else left->binsert(elem); return; } if (elem > data) // elem should be inserted into the right subtree { if (right == NULL) { right = new btree(elem); } else right->binsert(elem); } } template btree::btree(const btree& tree2) // copy constructor { data = tree2.data; empty = tree2.empty; left = right = NULL; if (tree2.left != NULL) { // tree2 has left subtree left = new btree(*(tree2.left)); } if (tree2.right != NULL) { // tree2 has right subtree right = new btree(*(tree2.right)); } } template btree::~btree() { if (left != NULL) delete left; if (right != NULL) delete right; } template bool btree::find(T& key) { if (empty == true) { return false; } if (key == data) return true; if (key <= data) // key might exist in the left subtree { if (left == NULL) return false; else return left->find(key); } if (key > data) // key might exist in the right subtree { if (right == NULL) return false; else return right->find(key); } } template void btree::inorder(std::ostream& out) { if (empty == true) { return; } if (left != NULL) { left->inorder(out); } out << data << " "; if (right!= NULL) { right->inorder(out); } } template void btree::preorder(std::ostream& out) { if (empty == true) { return; } out << data << " "; if (left != NULL) { left->preorder(out); } if (right != NULL) { right->preorder(out); } } template void btree::postorder(std::ostream& out) { if (empty == true) { return; } if (left != NULL) { left->postorder(out); } if (right != NULL) { right->postorder(out); } out << data << " "; } #endif