#include<iostream>
#include<stack>
using namespace std;
class node{
public:
int value;
node* left;
node* right;
node(int value)
{
this->value = value;
left = NULL;
right = NULL;
}
};
node* preorderToTree(int* a, int length)
{
if(length==0)
return NULL;
node* root = new node(a[0]);
stack<node*> s;
s.push(root);
for(int i=1; i<length; i++)
{
node* tmp = new node(a[i]);
if(tmp->value < s.top()->value)
{
s.top()->left = tmp;
}
else
{
node* popped = NULL;
while(!s.empty() && tmp->value > s.top()->value)
{
popped = s.top();
s.pop();
}
popped->right = tmp;
}
s.push(tmp);
}
return root;
}
void inorder(node* root)
{
if(root)
{
inorder(root->left);
cout<<root->value<<" ";
inorder(root->right);
}
}
int main()
{
int a[] = {10, 8, 5, 2, 6, 7, 9, 20, 15, 25, 23};
node* root = NULL;
root = preorderToTree(a, sizeof(a)/sizeof(a[0]));
inorder(root);
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0YWNrPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3Mgbm9kZXsKICBwdWJsaWM6CiAgaW50IHZhbHVlOwogIG5vZGUqIGxlZnQ7CiAgbm9kZSogcmlnaHQ7CiAgbm9kZShpbnQgdmFsdWUpCiAgewogICAgdGhpcy0+dmFsdWUgPSB2YWx1ZTsKICAgIGxlZnQgPSBOVUxMOwogICAgcmlnaHQgPSBOVUxMOwogIH0KfTsKCm5vZGUqIHByZW9yZGVyVG9UcmVlKGludCogYSwgaW50IGxlbmd0aCkKewogIGlmKGxlbmd0aD09MCkKICAgIHJldHVybiBOVUxMOwogIG5vZGUqIHJvb3QgPSBuZXcgbm9kZShhWzBdKTsKICBzdGFjazxub2RlKj4gczsKICBzLnB1c2gocm9vdCk7CiAgZm9yKGludCBpPTE7IGk8bGVuZ3RoOyBpKyspCiAgewogICAgbm9kZSogdG1wID0gbmV3IG5vZGUoYVtpXSk7CiAgICBpZih0bXAtPnZhbHVlIDwgcy50b3AoKS0+dmFsdWUpCiAgICB7CiAgICAgIHMudG9wKCktPmxlZnQgPSB0bXA7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIG5vZGUqIHBvcHBlZCA9IE5VTEw7CiAgICAgIHdoaWxlKCFzLmVtcHR5KCkgJiYgdG1wLT52YWx1ZSA+IHMudG9wKCktPnZhbHVlKQogICAgICB7CiAgICAgICAgcG9wcGVkID0gcy50b3AoKTsKICAgICAgICBzLnBvcCgpOwogICAgICB9CiAgICAgIHBvcHBlZC0+cmlnaHQgPSB0bXA7CiAgICB9CiAgICBzLnB1c2godG1wKTsKICB9CiAgcmV0dXJuIHJvb3Q7Cn0KCnZvaWQgaW5vcmRlcihub2RlKiByb290KQp7CiAgaWYocm9vdCkKICB7CiAgICBpbm9yZGVyKHJvb3QtPmxlZnQpOwogICAgY291dDw8cm9vdC0+dmFsdWU8PCIgIjsKICAgIGlub3JkZXIocm9vdC0+cmlnaHQpOwogIH0KfQoKaW50IG1haW4oKQp7CiAgaW50IGFbXSA9IHsxMCwgOCwgNSwgMiwgNiwgNywgOSwgMjAsIDE1LCAyNSwgMjN9OwogIG5vZGUqIHJvb3QgPSBOVUxMOwogIHJvb3QgPSBwcmVvcmRlclRvVHJlZShhLCBzaXplb2YoYSkvc2l6ZW9mKGFbMF0pKTsKICBpbm9yZGVyKHJvb3QpOwp9