#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
using namespace std;
struct Node
{
int val;
Node* left;
Node* right;
Node(int value)
{
this->val = value;
this->left=NULL;
this->right=NULL;
}
};
void preOrder(Node* root)
{
if(root==NULL)
return;
cout<<root->val;
preOrder(root->left);
preOrder(root->right);
}
void inOrder(Node* root)
{
if(root==NULL)
return;
inOrder(root->left);
cout<<root->val;
inOrder(root->right);
}
void postOrder(Node* root)
{
if(root==NULL)
return;
postOrder(root->left);
postOrder(root->right);
cout<<root->val;
}
void buildTree(Node* &tree)
{
tree = new Node(4);
tree->left = new Node(3);
tree->left->left = new Node(5);
//tree->left->left->right = new Node(10);
//tree->left->left->right->left = new Node(11);
tree->left->right = new Node(6);
tree->right = new Node(7);
tree->right->left = new Node(8);
tree->right->right = new Node(9);
}
int main()
{
Node* tree;
buildTree(tree);
preOrder(tree);
cout<<endl;
stack<Node*> s;
s.push(tree);
while(!s.empty())
{
Node* temp = s.top();
s.pop();
cout<<temp->val;
if(temp->right!=NULL)
s.push(temp->right);
if(temp->left!=NULL)
s.push(temp->left);
}
cout<<endl;
Node* tree2=tree;
cout << tree->val;
s.push(tree);
while(!s.empty()) {
Node *temp = s.top();
if (temp->left != NULL) {
cout << temp->left->val;
s.push(temp->left);
temp->left=NULL;
continue;
}
s.pop();
if (temp->right != NULL) {
cout << temp->right->val;
s.push(temp->right);
temp->right=NULL;
continue;
}
}
cout<<endl;
buildTree(tree);
Node* temp = tree;
while(!s.empty()||temp!=NULL)
{
if(temp!=NULL)
{
cout<<temp->val;
s.push(temp);
temp=temp->left;
}
else
{
temp = s.top();
s.pop();
temp = temp->right;
}
}
cout<<endl;
inOrder(tree);
cout<<endl;
s.push(tree);
while(!s.empty())
{
Node* temp = s.top();
if(temp->left!=NULL)
{
s.push(temp->left);
temp->left=NULL;
continue;
}
cout<<temp->val;
s.pop();
if(temp->right!=NULL)
{
s.push(temp->right);
temp->right=NULL;
continue;
}
}
cout<<endl;
buildTree(tree);
temp = tree;
while(!s.empty()||temp!=NULL)
{
if(temp!=NULL)
{
s.push(temp);
temp=temp->left;
} else{
temp = s.top();
cout<<temp->val;
s.pop();
temp = temp->right;
}
}
cout<<endl;
buildTree(tree);
postOrder(tree);
cout<<endl;
s.push(tree);
while(!s.empty())
{
Node* temp = s.top();
if(temp->left!=NULL)
{
s.push(temp->left);
temp->left=NULL;
continue;
}
if(temp->right!=NULL)
{
s.push(temp->right);
temp->right=NULL;
continue;
}
s.pop();
cout<<temp->val;
}
cout<<endl;
buildTree(tree);
s.push(tree);
vector<int> ans;
while(!s.empty())
{
Node* temp = s.top();
s.pop();
ans.push_back(temp->val);
if(temp->left!=NULL)
s.push(temp->left);
if(temp->right!=NULL)
s.push(temp->right);
}
for(int i=ans.size()-1;i>=0;i--)
cout<<ans[i];
return 0;
}