#include <iostream>
#include <string>
#include <assert.h>
using namespace std;


typedef struct TreeNode


{
char chDate;
TreeNode *lChild;
TreeNode *rChild;
int tag;
}TreeNode, *BiTree;

int count = 0;
char a[15] =

{'a', 'b', 'd', '@', '@', 'e', '@', '@',
'c', 'f', '@', '@', 'g', '@', '@'};

class newStack


{
public:
newStack()

{
top = -1;
maxSize = 10;
nums = new BiTree[maxSize];
};

~newStack()

{
delete []nums;
}

void Push(BiTree mdate)

{
assert(top < maxSize - 1);
top++;
nums[top] = mdate;
}

BiTree pop()

{
//assert(top > 0);
return nums[top--];
}

BiTree GetTop()

{
return nums[top];
}

int IsEmpty()

{
if(top > -1)
return 1;
else
return 0;
}


private:
BiTree *nums;
int maxSize;
int top;
};

void CreatTreeNode(BiTree &other)


{
char c;
//cout<<"Input the date of the Node: ";
//cin>>c;
c = a[count];
count++;

if(c == '@')

{
other = NULL;
}
else

{
other = new TreeNode;
other->chDate = c;
CreatTreeNode(other->lChild);
CreatTreeNode(other->rChild);
}
}

void Visit(TreeNode *Node)


{
if(Node)
cout<<Node->chDate<<endl;
}

void PreOrder(BiTree Node)


{
if(Node)

{
Visit(Node);
PreOrder(Node->lChild);
PreOrder(Node->rChild);
}
}

void InOrder(BiTree Node)


{
if(Node)

{
InOrder(Node->lChild);
Visit(Node);
InOrder(Node->rChild);
}
}

void PostOrder(BiTree Node)


{
if(Node)

{
PostOrder(Node->lChild);
PostOrder(Node->rChild);
Visit(Node);
}
}

void PreOrderWithoutRecursion(BiTree Node)


{
newStack *myStack = new newStack;
BiTree Temp = Node;
while(Temp || myStack->IsEmpty())

{
if(Temp)

{
Visit(Temp);
myStack->Push(Temp);
Temp = Temp->lChild;
}
else

{
Temp = myStack->GetTop();
myStack->pop();
Temp = Temp->rChild;
}
}

delete myStack;
}

void InOrderWithoutRecursion(BiTree Node)


{
newStack *myStack = new newStack;
BiTree Temp = Node;
while(Temp || myStack->IsEmpty())

{
if(Temp)

{
myStack->Push(Temp);
Temp = Temp->lChild;
}
else

{
Temp = myStack->GetTop();
Visit(Temp);
Temp = Temp->rChild;
myStack->pop();
}
}

delete myStack;
}

void PostOrderWithoutRecursion(BiTree Node)


{
newStack *myStack = new newStack;
BiTree Temp = Node;
while(Temp || myStack->IsEmpty())

{
while(Temp)

{
Temp->tag = 0;
myStack->Push(Temp);
Temp = Temp->lChild;
}

Temp = myStack->GetTop();
myStack->pop();

while(Temp->tag == 1)

{
Visit(Temp);
if(!myStack->IsEmpty())
return;

Temp = myStack->GetTop();
myStack->pop();
}

Temp->tag = 1;
myStack->Push(Temp);
Temp = Temp->rChild;
}

delete myStack;
}

void main()


{
BiTree myBiTree;
CreatTreeNode(myBiTree);
cout<<"PreOrder:"<<endl;
PreOrder(myBiTree);
cout<<"PreOrderWithoutRecursion:"<<endl;
PreOrderWithoutRecursion(myBiTree);
cout<<"InOrder:"<<endl;
InOrder(myBiTree);
cout<<"InOrderWithoutRecursion:"<<endl;
InOrderWithoutRecursion(myBiTree);
cout<<"PostOrder:"<<endl;
PostOrder(myBiTree);
cout<<"PostOrderWithoutRecursion:"<<endl;
PostOrderWithoutRecursion(myBiTree);
int z;
cin>>z;
}
posted on
2009-06-09 18:37
Jackill
阅读(
202)
评论()
收藏
举报