#include<iostream>
#include "stack"
using namespace std;
struct node{
char c;
node* left;
node *right;
bool flag;
};
void pre(node* head){//非递归前序遍历
stack<node*> s;
while (head || !s.empty()){
if (head){
cout << head->c;
s.push(head);
head = head->left;
}
else{
head = s.top()->right;
s.pop();
}
}
}
void middle(node* head){//非递归中序遍历
stack<node*> s;
node* p;
while (head || !s.empty()){
if (head){
s.push(head);
head = head->left;
}
else{
p = s.top();
cout << p->c;
s.pop();
head = p->right;
}
}
}
void post(node* head){//非递归后序遍历
node* p;
stack<node*> s;
while (head || !s.empty()){
if (head){
s.push(head);
head = head->left;
}
else{
p = s.top();
if (p->flag){
cout << p->c;
s.pop();
}
else{
head = p->right;
p->flag = true;//代表右子树已经访问过
}
}
}
}
int main(int argc, char **argv)
{
node f = { 'f', 0, 0, false };
node e = { 'e', &f, 0, false };
node d = { 'd', 0, 0, false };
node b = { 'b', &d, &e, false };
node g = { 'g', 0, 0, false };
node c = { 'c', 0, &g, false };
node a = { 'a', &b, &c, false };
pre(&a);
cout << endl;
middle(&a);
cout << endl;
post(&a);
}