#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;elsetemp_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");
}