#include <iostream>
using
namespace
std;
struct
node {
int
key;
struct
node *left, *right;
};
node* newNode(
int
item)
{
node* temp =
new
node();
temp->key = item;
temp->left = temp->right = NULL;
return
temp;
}
struct
node* insert(
struct
node* node,
int
key)
{
if
(node == NULL)
return
newNode(key);
if
(key < node->key)
node->left = insert(node->left, key);
else
if
(key > node->key)
node->right = insert(node->right, key);
return
node;
}
int
sizeOfTree(node* root)
{
if
(root == NULL) {
return
0;
}
int
left = sizeOfTree(root->left);
int
right = sizeOfTree(root->right);
return
(left + right + 1);
}
void
printMinMaxOrderUtil(node* root,
int
inOrder[],
int
& index)
{
if
(root == NULL) {
return
;
}
printMinMaxOrderUtil(root->left, inOrder, index);
inOrder[index++] = root->key;
printMinMaxOrderUtil(root->right, inOrder, index);
}
void
printMinMaxOrder(node* root)
{
int
numNode = sizeOfTree(root);
int
inOrder[numNode + 1];
int
index = 0;
printMinMaxOrderUtil(root, inOrder, index);
int
i = 0;
index--;
while
(i < index) {
cout << inOrder[i++] <<
" "
<< inOrder[index--] <<
" "
;
}
if
(i == index) {
cout << inOrder[i] << endl;
}
}
int
main()
{
struct
node* root = NULL;
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
printMinMaxOrder(root);
return
0;
}