#include<iostream>
#include<cstddef>
#include<iomanip>
#include<fstream>
using namespace std;
#include "TreeType.h"
#include "StackTreeNode.h"
struct TreeNode
{
ItemType info;// Thong tin tren node;
TreeNode *left;// Con tro toi cay con trai.
TreeNode *right;// Con tro toi cay con phai.
};
struct Info
{
TreeNode *ptr;
bool instruct;
};
// Nguyen mau cua cac ham bo tro.
void Destroy(TreeNode*& tree);
void CopyTree( TreeNode*& copy,const TreeNode *originalTree );
int CountNodes(TreeNode *tree);
int Depth(TreeNode *tree);
void Retrieve( TreeNode *tree, ItemType& item, bool& found);
void Insert( TreeNode*& tree, ItemType item);
void Delete( TreeNode*& tree, ItemType item);
void DeleteNode(TreeNode*& tree);
void GetPredecessor(TreeNode *tree, ItemType& data);
void PrintTree( TreeNode *tree, std::ofstream& outFile );
void PrintPreOrder( TreeNode *tree );
void PrintInOrder( TreeNode *tree );
void PrintPostOrder( TreeNode *tree );
// Dinh nghia cac ham cua lop.
TreeType::TreeType()
{
root = NULL;
}
TreeType::~TreeType()
{
Destroy(root);
}
TreeType::TreeType( const TreeType& originalTree )
{
CopyTree( root, originalTree.root );
}
void TreeType::operator=( const TreeType& originalTree )
{
if(&originalTree == this)
return;
Destroy(root);
CopyTree(root,originalTree.root);
}
void TreeType::MakeEmpty()
{
Destroy(root);
root = NULL;
}
bool TreeType::IsEmpty() const
{
return(root == NULL);
}
bool TreeType::IsFull() const
{
TreeNode *location;
location = new TreeNode;
if(location == NULL)
return true;
else
return false;
delete location;
}
int TreeType::LengthTree()
{
return CountNodes(root);
}
int TreeType::DepthTree()
{
return Depth(root);
}
void TreeType::RetrieveItem( ItemType& item, bool& found)
{
Retrieve(root,item,found);
}
void TreeType::InsertItem(ItemType item)
{
if( IsFull() )
{
cout << "Het bo nho de cap phat !\n"; exit(1);
}
Insert(root,item);
}
void TreeType::DeleteItem( ItemType item)
{
if( IsEmpty() )
{
cout << setw
(25) << " " << "Cay rong !\n"; return;
}
Delete(root,item);
}
void TreeType::Print(std::ofstream& outFile)
{
PrintTree(root,outFile);
}
void TreeType::PrintOrderTree( OrderType order )
{
switch(order)
{
case PRE_ORDER: PrintPreOrder(root);
break;
case IN_ORDER:
PrintInOrder(root);
break;
case POST_ORDER : PrintPostOrder(root);
break;
}
}
// Dinh nghia cac ham ho tro.
void Destroy(TreeNode*& tree)
{
if(tree != NULL)
{
Destroy(tree->left);
Destroy(tree->right);
delete tree;
}
}
void CopyTree( TreeNode*& copy,const TreeNode *originalTree )
{
if(originalTree == NULL )
copy = NULL;
else
{
copy = new TreeNode;
copy->info = originalTree->info;
CopyTree(copy->left,originalTree->left);
CopyTree(copy->right,originalTree->right);
}
}
int CountNodes(TreeNode *tree)
{
if(tree == NULL)
return 0;
else
return CountNodes(tree->left) + CountNodes(tree->right) + 1;
}
int Depth(TreeNode *tree)
{
if(tree == NULL)
return 0;
int leftSubTreeDepth = Depth(tree->left);
int rightSubTreeDepth = Depth(tree->right);
return (1 + (leftSubTreeDepth > rightSubTreeDepth ? leftSubTreeDepth : rightSubTreeDepth));
}
void Retrieve( TreeNode *tree, ItemType& item, bool& found)
{
if(tree == NULL)
found = false;
else if(item < tree->info)
Retrieve(tree->left,item,found);
else if(item > tree->info)
Retrieve(tree->right,item,found);
else
{
found = true;
item = tree->info;
}
}
void Insert( TreeNode*& tree, ItemType item)
{
if(tree == NULL)
{
tree = new TreeNode;
tree->info = item;
tree->left = NULL;
tree->right = NULL;
}
else if(item < tree->info)
Insert(tree->left,item);// Chen vao cay con trai.
else if(item > tree->info)
Insert(tree->right,item);// Chen vao cay con phai.
}
void Delete( TreeNode*& tree, ItemType item )
{
if(item < tree->info)
Delete(tree->left,item);
else if(item > tree->info)
Delete(tree->right,item);
else
DeleteNode(tree);
}
void DeleteNode(TreeNode*& tree)
{
ItemType data;
TreeNode *temPtr;
temPtr = tree;
if(tree->left == NULL)
{
tree = tree->right;
delete temPtr;
}
else if(tree->right == NULL)
{
tree = tree->left;
delete temPtr;
}
GetPredecessor(tree->left,data);
tree->info = data;
Delete(tree->left,data);
}
}
void GetPredecessor( TreeNode *tree, ItemType& data )
{
while(tree->right != NULL)
tree = tree->right;
data = tree->info;
}
void PrintTree( TreeNode *tree, std::ofstream& outFile )
{
if(tree != NULL)
{
PrintTree(tree->left,outFile);
outFile << tree->info;
PrintTree(tree->right,outFile);
}
}
/*void PrintPreOrder( TreeNode *tree )
{
if( tree != NULL )
{
cout << setw(3) << tree->info;
PrintPreOrder( tree->left );
PrintPreOrder( tree->right );
}
cout << endl;
}*/
/*void PrintInOrder( TreeNode *tree )
{
if( tree != NULL )
{
PrintInOrder( tree->left );
cout << setw(3) << tree->info;
PrintInOrder( tree-> right );
}
}*/
/*void PrintPostOrder( TreeNode *tree )
{
if( tree != NULL )
{
PrintPostOrder( tree->left );
PrintPostOrder( tree->right );
cout << setw(3) << tree->info;
}
}*/
[COLOR="Red"]void PrintPreOrder( TreeNode *tree )
{
StackTreeNode stackPre;
Info element;
while((tree != NULL) || (!stackPre.IsEmpty()))
{
while( tree != NULL )
{
cout << setw
(3) << tree
->info
;
element.ptr = tree;
element.instruct = true;
stackPre.Push(element);
tree = tree->left;
}
element = stackPre.Top();
stackPre.Pop();
tree = element.ptr;
tree = tree->right;
}
}
void PrintInOrder( TreeNode *tree )
{
StackTreeNode stackIn;
Info element;
while((tree != NULL) || (!stackIn.IsEmpty()))
{
while( tree != NULL )
{
element.ptr = tree;
element.instruct = true;
stackIn.Push(element);
tree = tree->left;
}
element = stackIn.Top();
stackIn.Pop();
tree = element.ptr;
cout << setw
(3) << tree
->info
; tree = tree->right;
}
}
void PrintPostOrder( TreeNode * tree )
{
StackTreeNode stackPost;
Info element;
while((tree != NULL) || (!stackPost.IsEmpty()))
{
while( tree != NULL )
{
element.ptr = tree;
element.instruct = true;
stackPost.Push(element);
tree = tree->left;
}
element = stackPost.Top();
stackPost.Pop();
tree = element.ptr;
if( element.instruct )
{
element.instruct = false;
element.ptr = tree;
stackPost.Push(element);
tree = tree->right;
}
else
{
cout << setw
(3) << tree
->info
; tree = NULL;
}
}[/COLOR]
}