#include <iostream>
using namespace std;
struct tree_node
{
int data;
tree_node* lc;
tree_node* rc;
tree_node* parent;
};
class solution
{
public:
tree_node* find_next_node(tree_node* some_node)
{
if (!some_node)
return nullptr;
if (some_node->rc)
{
some_node = some_node->rc;
while (some_node->lc)
{
some_node = some_node->lc;
}
return some_node;
}
else if (some_node->parent && some_node->parent->lc == some_node)
{
return some_node->parent;
}
else if (some_node->parent && some_node->parent->rc == some_node)
{
some_node = some_node->parent;
while (some_node->parent && some_node->parent->lc != some_node)
some_node = some_node->parent;
if (some_node->parent)
return some_node->parent;
}
else
{
return nullptr;
}
return nullptr;
}
tree_node* create_btree(istream& in)
{
int value;
if (!(in >> value))
return nullptr;
tree_node* root = new tree_node;
root->lc = root->rc = root->parent = nullptr;
root->data = value;
while (in >> value)
{
tree_node* temp_root = root;
tree_node* new_node = new tree_node;
new_node->data = value;
new_node->lc = new_node->rc = new_node->parent = nullptr;
while (true)
{
if (!temp_root->lc)
{
temp_root->lc = new_node;
new_node->parent = temp_root;
new_node = nullptr;
break;
}
else if (!temp_root->rc)
{
temp_root->rc = new_node;
new_node->parent = temp_root;
new_node = nullptr;
break;
}
else
{
if (rand() % 2)
temp_root = temp_root->lc;
else
temp_root = temp_root->rc;
}
}
}
return root;
}
void trav_in_recur(tree_node* root)
{
if (!root)
return;
trav_in_recur(root->lc);
cout << root->data << " ";
trav_in_recur(root->rc);
}
};
int main()
{
solution a;
tree_node* root = a.create_btree(cin);
tree_node* some_node = root->lc->rc;
if (some_node)
cout << some_node->data << endl;
a.trav_in_recur(root);
cout << endl;
tree_node* find = a.find_next_node(some_node);
if (find)
cout << find->data << endl;
system("pause");
}