/* File: bintree.C Copyright glh 8/15/94 */ #include "bintree.H" template ostream& operator<<(ostream& os, const Bnode& v) { os << v.data; return os; } template BinaryTree::BinaryTree(const T& elm) { root = new Bnode(elm); assert(root != 0); root->parent = 0; } template Boolean BinaryTree::InsertLeaf(Bnode* leaf, Bnode* prnt, Child lr) { if (prnt == 0) // inserting root if (root != 0) return false; else root = leaf; else { leaf->parent = prnt; if (lr == left) { // inserting a left child if (prnt->lchild == 0) prnt->lchild = leaf; else return false; } else { // inserting a right child if (prnt->rchild == 0) prnt->rchild = leaf; else return false; } } return true; } template void BinaryTree::DeleteSubtree(Bnode* v) { if (v->lchild != 0) DeleteSubtree(v->lchild); if (v->rchild != 0) DeleteSubtree(v->rchild); delete v; } template void BinaryTree::MakeEmpty() { if (root != 0) DeleteSubtree(root); root = 0; } template void BinaryTree::InorderSubtreePrint(ostream& os, Bnode* v) const { if (v != 0) { if (v->lchild != 0) InorderSubtreePrint(os, v->lchild); os << *v << ", "; if (v->rchild != 0) InorderSubtreePrint(os, v->rchild); } } template ostream& operator<<(ostream& os, const BinaryTree& tree) { os << "("; if (tree.root != 0) { tree.InorderSubtreePrint(os, tree.root); os << "\b)"; } else os << ")"; return os; }