//brian jahns
//cs252 1999
//binary tree .cc file
#include <iostream.h>
#include <assert.h>
#include "Bintree.h"
//binary node constructor
template <class T>
Bnode<T>::Bnode(T d, Bnode<T>* lc, Bnode<T>* rc){
data = d;
lchild = lc;
rchild = rc;
}
//default constructor
template <class T>
BinTree<T>::BinTree() : root(0) {}
//copy constructor
template <class T>
BinTree<T>::BinTree(const BinTree<T>& bt){
CopyTree(bt.root, root);
}
//destructor
template <class T>
BinTree<T>::~BinTree(){
DelTree(root);
}
template <class T>
bool BinTree<T>::IsEmpty(){
return (root == 0);
}
//PreOrder Wrapper
template <class T>
void BinTree<T>::PreOrder() const {
PreOrderHelper(root);
}
//InOrder Wrapper
template <class T>
void BinTree<T>::InOrder() const {
InOrderHelper(root);
}
//PostOrder Wrapper
template <class T>
void BinTree<T>::PostOrder() const {
PostOrderHelper(root);
}
//Outputs tree with PreOrder Traversal
template <class T>
void BinTree<T>::PreOrderHelper(Bnode<T>* node) const {
if (node != 0){
cout << node->data;
PreOrderHelper(node->lchild);
PreOrderHelper(node->rchild);
}
}
//Outputs tree with InOrder Traversal
template <class T>
void BinTree<T>::InOrderHelper(Bnode<T>* node) const {
if (node != 0){
InOrderHelper(node->lchild);
cout << node->data;
InOrderHelper(node->rchild);
}
}
//Outputs tree with PostOrder Traversal
template <class T>
void BinTree<T>::PostOrderHelper(Bnode<T>* node) const {
if (node != 0){
PostOrderHelper(node->lchild);
PostOrderHelper(node->rchild);
cout << node->data;
}
}
//Deletes an entire tree given a root node
template <class T>
void BinTree<T>::DelTree(Bnode<T>*& node){
if (node != 0){
DelTree(node->lchild);
DelTree(node->rchild);
delete node;
node = 0;
}
}
//Makes a copy of a tree
template <class T>
void BinTree<T>::CopyTree(Bnode<T>* onode, Bnode<T>*& nnode){
if (node != 0){
nnode = new Bnode<T>(onode->data, 0, 0);
assert(nnode != 0);
CopyTree(onode->lchild, nnode->lchild);
CopyTree(onode->rchild, nnode->rchild);
}
else
nnode = 0;
}