#include<iostream>
#include<stack>
using namespace std;
struct BiTreeNode{
int value;
BiTreeNode *left;
BiTreeNode *right;
BiTreeNode(int data){
this->value = data;
}
};
void preOrderRecur(BiTreeNode *head){
if(head == NULL)
return;
cout<<head->value<<" ";
preOrderRecur(head->left);
preOrderRecur(head->right);
}
void inOrderRecur(BiTreeNode *head){
if(head == NULL)
return;
inOrderRecur(head->left);
cout<<head->value<<" ";
inOrderRecur(head->right);
}
void postOrderRecur(BiTreeNode *head){
if(head == NULL)
return;
postOrderRecur(head->left);
postOrderRecur(head->right);
cout<<head->value<<" ";
}
void preOrderUnrecur(BiTreeNode *head){
if(head != NULL){
stack<BiTreeNode*>s;
s.push(head);
while(!s.empty()){
head = s.top();
cout<<head->value<<" ";
s.pop();
if(head->right!=NULL)
s.push(head->right);
if(head->left!=NULL)
s.push(head->left);
}
}
}
void inOrderUnrecur(BiTreeNode *head){
if(head != NULL){
stack<BiTreeNode*>s;
while(!s.empty() || head != NULL){
if(head != NULL){
s.push(head);
head = head -> left;
}
else{
head = s.top();
cout<<head->value<<" ";
s.pop();
head = head -> right;
}
}
}
}
void postOrderUnrecur(BiTreeNode *head){
if(head != NULL){
stack<BiTreeNode*>s1;
stack<BiTreeNode*>s2;
s1.push(head);
while(!s1.empty()){
head = s1.top();
s2.push(head);
s1.pop();
if(head->left!=NULL)
s1.push(head->left);
if(head->right!=NULL)
s1.push(head->right);
}
while(!s2.empty()){
cout<<s2.top()->value<<" ";
s2.pop();
}
}
}
int main()
{
BiTreeNode *head = new BiTreeNode(5);
head->left = new BiTreeNode(3);
head->right = new BiTreeNode(8);
head->left->left = new BiTreeNode(2);
head->left->left->right = NULL;
head->left->right = new BiTreeNode(4);
head->left->right->left = NULL;
head->left->right->right = NULL;
head->left->left->left = new BiTreeNode(1);
head->left->left->left->left = NULL;
head->left->left->left->right = NULL;
head->right->left = new BiTreeNode(7);
head->right->left->right = NULL;
head->right->left->left = new BiTreeNode(6);
head->right->left->left->left = NULL;
head->right->left->left->right = NULL;
head->right->right = new BiTreeNode(10);
head->right->right->left = new BiTreeNode(9);
head->right->right->left->left = NULL;
head->right->right->left->right = NULL;
head->right->right->right = new BiTreeNode(11);
head->right->right->right->left = NULL;
head->right->right->right->right = NULL;
cout<<"==============recursive====================="<<endl;
cout<<"pre-order:"<<endl;
preOrderRecur(head);
cout<<endl;
cout<<"in-order:"<<endl;
inOrderRecur(head);
cout<<endl;
cout<<"post-order:"<<endl;
postOrderRecur(head);
cout<<endl;
cout<<"==============unrecursive===================="<<endl;
cout<<"pre-order:"<<endl;
preOrderUnrecur(head);
cout<<endl;
cout<<"in-order:"<<endl;
inOrderUnrecur(head);
cout<<endl;
cout<<"post-order:"<<endl;
postOrderUnrecur(head);
cout<<endl;
return 0;
}