#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  阅读(198)  评论(0编辑  收藏  举报