#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
node* left;
node* right;
};
node* newNode(int k)
{
node* temp = new node;
temp->data = k;
temp->right = NULL;
temp->left = NULL;
return temp;
}
void modifiedLevelOrder(node* root)
{
if(root == NULL)
return;
if (root->left == NULL && root->right == NULL) {
cout << root->data;
return;
}
queue<node*> q;
stack<node*> s;
q.push(root);
int size = 0;
bool RightToLeft = false;
int ct = 0;
while(!q.empty())
{
ct++;
size = q.size();
int count = 0;
while(count < size)
{
node* temp = q.front();
q.pop();
if(temp->left)
{
q.push(temp->left);
}
if(temp->right)
{
q.push(temp->right);
}
if(RightToLeft == false)
{
cout << temp->data << " ";
}
else
{
s.push(temp);
}
count++;
}
if(RightToLeft)
{
while(!s.empty())
{
node* temps;
temps = s.top();
cout << temps->data << " ";
s.pop();
}
}
if(ct == 2)
{
RightToLeft = ! RightToLeft;
ct = 0;
}
cout << endl;
}
}
int main()
{
// Let us create binary tree
node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
root->right->left = newNode(6);
root->right->right = newNode(7);
root->left->left->left = newNode(8);
root->left->left->right = newNode(9);
root->left->right->left = newNode(3);
root->left->right->right = newNode(1);
root->right->left->left = newNode(4);
root->right->left->right = newNode(2);
root->right->right->left = newNode(7);
root->right->right->right = newNode(2);
root->left->right->left->left = newNode(16);
root->left->right->left->right = newNode(17);
root->right->left->right->left = newNode(18);
root->right->right->left->right = newNode(19);
//levelorder(root);
modifiedLevelOrder(root);
return 0;
}