#include <iostream>
#include <stack>
using namespace std;
struct Node{
Node* lchild;
Node* rchild;
char value;
};
class list{
public:
list::list();
void PreOrder();
void InOrder();
void PostOrder();
void PostOrder2();
private:
Node* root;
};
list::list()
{
cout<<"请输入您要输入的数字,按#键退出"<<endl;
char i;
cin>>i;
if(i=='#')
return;
root=new Node;
root->value=i;
root->lchild=NULL;
root->rchild=NULL;
Node *p,*q;
while(1){
cin>>i;
if(i=='#')
break;
p=new Node;
p->value=i;
p->lchild=NULL;
p->rchild=NULL;
q=root;
while(q){
if(p->value<q->value){
if(q->lchild)
q=q->lchild;
else{
q->lchild=p;
break;
}
}
else{
if(q->rchild)
q=q->rchild;
else{
q->rchild=p;
break;
}
}
}
}
}
void list::PreOrder()
{
stack<Node*> s;
Node* curr=root;
while(1){
while(curr){
cout<<curr->value<<" ";
if(curr->rchild)
s.push(curr->rchild);
curr=curr->lchild;
}
if(s.empty())
break;
curr=s.top();
s.pop();
}
}
void list::InOrder()
{
stack<Node*> s;
Node* curr=root;
while(1){
while(curr){
s.push(curr);
curr=curr->lchild;
}
if(s.empty())
break;
curr=s.top();
cout<<curr->value<<" ";
s.pop();
curr=curr->rchild;
}
}
void list::PostOrder()
{
if(!root)
return;
stack<Node*> s;
Node* curr=root;
Node* temp=NULL;
while(1){
while(curr){
s.push(curr);
curr=curr->lchild;
}
if(s.empty())
break;
curr=s.top();
if(curr->rchild==NULL || curr->rchild==temp){
cout<<curr->value<<" ";
temp=curr;
s.pop();
curr=NULL;
}
else
curr=curr->rchild;
}
}
void list::PostOrder2()
{
stack<Node*> s;
Node *curr=root,*temp=NULL;
while(1){
while(curr){
s.push(curr);
if(curr->rchild)
s.push(curr->rchild);
curr=curr->lchild;
}
if(s.empty())
break;
curr=s.top();
if(curr->rchild==NULL || curr->rchild==temp){
cout<<curr->value<<" ";
temp=curr;
s.pop();
curr=NULL;
}
else
s.pop();
}
}
void main()
{
list test;
test.PostOrder();
system("pause");
}