// file tree.cpp

// methods for class Tree

 

#include <assert.h>

#include <stdlib.h>

#include <iostream.h>

#include "tree.h"

 

Tree::Tree()

{

      root = NULL;

}

 

Tree::Tree(Type x)

{

      root = new Tnode;

      assert(root);

      root->setinfo(x);

}

 

void Tree::makeroot(Type x)

{

      root = new Tnode;

      assert(root);

      root->setinfo(x);

}

 

Tree::~Tree()

{

      if (isempty()) return;

      clear(root);

}

 

void Tree::clear (Tnode *t)

{

      if (t==NULL) return;

      clear(t->getleft());

      clear(t->getright());

      delete t;

}

 

int Tree::isempty()

{

      return (root==NULL);

}

 

Tnode *Tree::getroot()

{

      return root;

}

 

Type Tree::getdata()

{

      assert(root);

      return root->getinfo();

}

 

Tnode *Tree::getleft()

{

      assert(root);

      return root->getleft();

}

 

Tnode *Tree::getright()

{

      assert(root);

      return root->getright();

}

 

void Tree::setdata(Type x)

{

      assert(root);

      root->setinfo(x);

}

 

void Tree::insertleft(Tnode *p, Type x)

{

      Tnode *q;

      assert(p);

      assert(!(p->getleft()));

      q = new Tnode;

      assert(q);

      p->setleft(q);

      q->setinfo(x);

 

}

 

void Tree::insertright(Tnode *p, Type x)

{

      Tnode *q;

      assert(p);

      assert(!(p->getright()));

      q = new Tnode;

      assert(q);

      p->setright(q);

      q->setinfo(x);

}

 

void Tree::print(int mode)

{

      assert(mode>=1 && mode<=3);

      if (mode==1) pretrav();

      if (mode==2) intrav();

      if (mode==3) postrav();

}

 

void Tree::pretrav()

{

      if (isempty()) return;

      pretrav(root);

      cout<<endl<<endl;

}

 

void Tree::pretrav(Tnode *t)

{

      if (t==NULL) return;

      cout<<t->getinfo()<<' ';

      pretrav(t->getleft());

      pretrav(t->getright());

}

 

void Tree::intrav()

{

      if (isempty()) return;

      intrav(root);

      cout<<endl<<endl;

}

 

void Tree::intrav(Tnode *t)

{

      if (t==NULL) return;

      intrav(t->getleft());

      cout<<t->getinfo()<<' ';

      intrav(t->getright());

}

 

void Tree::postrav()

{

      if (isempty()) return;

      postrav(root);

      cout<<endl<<endl;

}

 

void Tree::postrav(Tnode *t)

{

      if (t==NULL) return;

      postrav(t->getleft());

      postrav(t->getright());

      cout<<t->getinfo()<<' ';

}