#include <bits/stdc++.h>
using
namespace
std;
struct
node {
struct
node* left;
struct
node* right;
int
data;
};
struct
node* newNode(
int
data)
{
struct
node* temp =
new
node;
temp->data = data;
temp->left = NULL;
temp->right = NULL;
return
temp;
}
int
HeightOfTree(
struct
node* root)
{
if
(root == NULL)
return
0;
int
lheight = HeightOfTree(root->left);
int
rheight = HeightOfTree(root->right);
return
max(lheight + 1, rheight + 1);
}
void
Print_Level_Right_To_Left(
struct
node* root,
int
level)
{
if
(root == NULL)
return
;
if
(level == 1)
cout << root->data <<
" "
;
else
if
(level > 1) {
Print_Level_Right_To_Left(root->right, level - 1);
Print_Level_Right_To_Left(root->left, level - 1);
}
}
void
Print_Level_Left_To_Right(
struct
node* root,
int
level)
{
if
(root == NULL)
return
;
if
(level == 1)
cout << root->data <<
" "
;
else
if
(level > 1) {
Print_Level_Left_To_Right(root->left, level - 1);
Print_Level_Left_To_Right(root->right, level - 1);
}
}
void
PrintReverseZigZag(
struct
node* root)
{
int
flag = 1;
int
height = HeightOfTree(root);
for
(
int
i = height; i >= 1; i--) {
if
(flag == 1) {
Print_Level_Right_To_Left(root, i);
flag = 0;
}
else
if
(flag == 0) {
Print_Level_Left_To_Right(root, i);
flag = 1;
}
}
}
int
main()
{
struct
node* root = newNode(5);
root->left = newNode(9);
root->right = newNode(3);
root->left->left = newNode(6);
root->right->right = newNode(4);
root->left->left->left = newNode(8);
root->left->left->right = newNode(7);
PrintReverseZigZag(root);
return
0;
}