#ifndef __BINARY_TREE_H
#define __BINARY_TREE_H
#include <assert.h>
#include <iterator.h>
#include <nodeTree.h>
namespace EstDatos
{
template <class T>
class binaryTree {
public:
virtual bool isEmpty () const = 0;
virtual binaryTree<T>& left () const = 0;
virtual binaryTree<T>& right () const = 0;
virtual T labelRoot () const = 0;
virtual void setLabelRoot (const T & value) = 0;
virtual void setLeft (const binaryTree<T> & left) = 0;
virtual void setRight (const binaryTree<T> & right) = 0;
};
template <class T>
class inorderTreeTraversal;
template <class T>
class postorderTreeTraversal;
template <class T>
class preorderTreeTraversal;
template <class T>
class levelorderTreeTraversal;
template <class T>
class binaryTreeNode : public binaryTree<T> {
friend class inorderTreeTraversal<T>;
friend class postorderTreeTraversal<T>;
friend class preorderTreeTraversal<T>;
friend class levelorderTreeTraversal<T>;
friend istream & operator >> <T> (istream & in, binaryTreeNode<T> & t);
friend ostream & operator << <T> (ostream & out,
const binaryTreeNode<T> & t);
friend istream & operator >> <T> (istream & in, binaryTreeNode<T> * & t);
friend ostream & operator << <T> (ostream & out, binaryTreeNode<T> * t);
public:
binaryTreeNode ();
binaryTreeNode (const T & value);
binaryTreeNode (const T & value,
const binaryTreeNode<T> & left,
const binaryTreeNode<T> & right);
binaryTreeNode (const binaryTreeNode<T> & source);
~binaryTreeNode ();
binaryTreeNode<T> & operator = (const binaryTreeNode<T> & source);
bool isEmpty () const;
binaryTreeNode<T>& left () const;
binaryTreeNode<T>& right () const;
T labelRoot () const;
void setLabelRoot (const T & value);
void setLeft (const binaryTree<T> & left);
void setRight (const binaryTree<T> & right);
protected:
nodeTree<T> * ptrToRootNode;
binaryTreeNode (nodeTree<T> * root);
};
template <class T>
class inorderTreeTraversal : public inorderTraversal<T> {
public:
inorderTreeTraversal (binaryTreeNode<T> & aTree);
inorderTreeTraversal (const binaryTreeNode<T> & aTree);
inorderTreeTraversal (const inorderTreeTraversal<T> & source);
virtual T & operator = (const T & value);
};
template <class T>
class postorderTreeTraversal : public postorderTraversal<T> {
public:
postorderTreeTraversal (binaryTreeNode<T> & aTree);
postorderTreeTraversal (const binaryTreeNode<T> & aTree);
postorderTreeTraversal (const postorderTreeTraversal<T> & source);
virtual T & operator = (const T & value);
};
template <class T>
class preorderTreeTraversal : public preorderTraversal<T> {
public:
preorderTreeTraversal (binaryTreeNode<T> & aTree);
preorderTreeTraversal (const binaryTreeNode<T> & aTree);
preorderTreeTraversal (const preorderTreeTraversal<T> & source);
virtual T & operator = (const T & value);
};
template <class T>
class levelorderTreeTraversal : public levelorderTraversal<T> {
public:
levelorderTreeTraversal (binaryTreeNode<T> & aTree);
levelorderTreeTraversal (const binaryTreeNode<T> & aTree);
levelorderTreeTraversal (const levelorderTreeTraversal<T> & source);
virtual T & operator = (const T & value);
};
template <class T>
binaryTreeNode<T>::binaryTreeNode () : ptrToRootNode(0)
{
}
template <class T>
binaryTreeNode<T>::binaryTreeNode (const T & value)
{
ptrToRootNode = new nodeTree<T>(value, 0, 0);
assert(ptrToRootNode != 0);
}
template <class T>
binaryTreeNode<T>::binaryTreeNode (const T & value,
const binaryTreeNode<T> & left,
const binaryTreeNode<T> & right)
{
nodeTree<T> * leftTree;
nodeTree<T> * rightTree;
if (left.ptrToRootNode)
leftTree = left.ptrToRootNode->duplicate();
else
leftTree = 0;
if (right.ptrToRootNode)
rightTree = right.ptrToRootNode->duplicate();
else
rightTree = 0;
ptrToRootNode = new nodeTree<T>(value, leftTree, rightTree);
assert(ptrToRootNode != 0);
}
template <class T>
binaryTreeNode<T>::binaryTreeNode (nodeTree<T> * root) : ptrToRootNode(0)
{
if (root)
ptrToRootNode = root->duplicate();
}
template <class T>
binaryTreeNode<T>::binaryTreeNode (const binaryTreeNode<T> & source)
{
if (source.ptrToRootNode)
ptrToRootNode = source.ptrToRootNode->duplicate();
else
ptrToRootNode = 0;
}
template <class T>
binaryTreeNode<T>::~binaryTreeNode ()
{
if (ptrToRootNode != 0) {
ptrToRootNode->free();
delete ptrToRootNode;
ptrToRootNode = 0;
}
}
template <class T>
binaryTreeNode<T> & binaryTreeNode<T>::operator =
(const binaryTreeNode<T> & source)
{
if (ptrToRootNode != 0) {
ptrToRootNode->free();
delete ptrToRootNode;
ptrToRootNode=0;
}
if (source.ptrToRootNode != 0)
ptrToRootNode = source.ptrToRootNode->duplicate();
return *this;
}
template <class T>
bool binaryTreeNode<T>::isEmpty () const
{
return ptrToRootNode == 0;
}
template <class T>
T binaryTreeNode<T>::labelRoot () const
{
assert(ptrToRootNode != 0);
return ptrToRootNode->label();
}
template <class T>
void binaryTreeNode<T>::setLabelRoot (const T & value)
{
assert(ptrToRootNode != 0);
ptrToRootNode->setLabel(value);
}
template <class T>
binaryTreeNode<T> & binaryTreeNode<T>::left () const
{
assert(ptrToRootNode != 0);
binaryTreeNode<T> * ptrToLeft;
ptrToLeft = new binaryTreeNode<T>(ptrToRootNode->left());
return *ptrToLeft;
}
template <class T>
void binaryTreeNode<T>::setLeft (const binaryTree<T> & left)
{
assert(ptrToRootNode != 0);
nodeTree<T> * ptrToLeft = 0;
if (! left.isEmpty())
ptrToLeft = ((binaryTreeNode<T> &) left).ptrToRootNode;
ptrToRootNode->setLeft(ptrToLeft->duplicate());
}
template <class T>
binaryTreeNode<T> & binaryTreeNode<T>::right () const
{
assert(ptrToRootNode != 0);
binaryTreeNode<T> * ptrToRight;
ptrToRight = new binaryTreeNode<T>(ptrToRootNode->right());
return *ptrToRight;
}
template <class T>
void binaryTreeNode<T>::setRight (const binaryTree<T> & right)
{
assert(ptrToRootNode != 0);
nodeTree<T> * ptrToRight = 0;
if (! right.isEmpty())
ptrToRight = ((binaryTreeNode<T> &) right).ptrToRootNode;
ptrToRootNode->setRight(ptrToRight->duplicate());
}
template <class T>
istream & operator >> (istream & in, binaryTreeNode<T> & t)
{
in >> t.ptrToRootNode;
return in;
}
template <class T>
istream & operator >> (istream & in, binaryTreeNode<T> * & t)
{
binaryTreeNode<T> * p = new binaryTreeNode<T>();
in >> p->ptrToRootNode;
t = p;
return in;
}
template <class T>
ostream & operator << (ostream & out, const binaryTreeNode<T> & t)
{
out << t.ptrToRootNode;
return out;
}
template <class T>
ostream & operator << (ostream & out, binaryTreeNode<T> * t)
{
if (t)
out << *t;
return out;
}
template <class T>
inorderTreeTraversal<T>::inorderTreeTraversal (binaryTreeNode<T> & aTree)
: inorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
inorderTreeTraversal<T>::inorderTreeTraversal
(const binaryTreeNode<T> & aTree) :
inorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
inorderTreeTraversal<T>::inorderTreeTraversal
(const inorderTreeTraversal<T> & source) :
inorderTraversal<T>(source)
{
}
template <class T>
T & inorderTreeTraversal<T>::operator = (const T & value)
{
return inorderTraversal<T>::operator=(value);
}
template <class T>
postorderTreeTraversal<T>::postorderTreeTraversal
(binaryTreeNode<T> & aTree) :
postorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
postorderTreeTraversal<T>::postorderTreeTraversal
(const binaryTreeNode<T> & aTree) :
postorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
postorderTreeTraversal<T>::postorderTreeTraversal
(const postorderTreeTraversal<T> & source) :
postorderTraversal<T>(source)
{
}
template <class T>
T & postorderTreeTraversal<T>::operator = (const T & value)
{
return postorderTraversal<T>::operator=(value);
}
template <class T>
preorderTreeTraversal<T>::preorderTreeTraversal
(binaryTreeNode<T> & aTree) :
preorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
preorderTreeTraversal<T>::preorderTreeTraversal
(const binaryTreeNode<T> & aTree) :
preorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
preorderTreeTraversal<T>::preorderTreeTraversal
(const preorderTreeTraversal<T> & source) :
preorderTraversal<T>(source)
{
}
template <class T>
T & preorderTreeTraversal<T>::operator = (const T & value)
{
return preorderTraversal<T>::operator=(value);
}
template <class T>
levelorderTreeTraversal<T>::levelorderTreeTraversal
(binaryTreeNode<T> & aTree) :
levelorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
levelorderTreeTraversal<T>::levelorderTreeTraversal
(const binaryTreeNode<T> & aTree) :
levelorderTraversal<T>(aTree.ptrToRootNode)
{
}
template <class T>
levelorderTreeTraversal<T>::levelorderTreeTraversal
(const levelorderTreeTraversal<T> & source) :
levelorderTraversal<T>(source)
{
}
template <class T>
T & levelorderTreeTraversal<T>::operator = (const T & value)
{
return levelorderTraversal<T>::operator=(value);
}
}
#endif |