#include <iostream>
using namespace std;
class binary_tree {
public:
int value;
binary_tree* parent;
binary_tree* left;
binary_tree* right;
public:
binary_tree(int d) :parent{ nullptr }, left{ nullptr }, right{ nullptr }, value{ d }{
}
bool add(int, string, int = 0);
binary_tree* move2(string, int = 0);
};
int main()
{
binary_tree tree(0);
tree.add(1, "0");
tree.add(2, "1");
tree.add(3, "10");
tree.add(4, "01");
tree.add(5, "00");
tree.add(6, "11");
tree.add(7, "111");
tree.add(8, "110");
tree.add(9, "1110");
tree.add(10, "1111");
cout << (tree.move2("111"))->value << endl;
}
bool binary_tree::add(int v, string track, int index) {
if (track.size() > 4 || track.size() == 0)
return false;
binary_tree*& next = (track[index] == '0' ? left : right);
if (next && index == track.size() - 1)
return false;
else if (!next) {
next = new binary_tree(v);
next->parent = this;
return true;
}
else
next->add(v, track, index + 1);
}
binary_tree* binary_tree::move2(string track, int index) {
binary_tree* next = (track[index] == '0' ? left : right);
if (!next)
return this;
else if (next && (index == track.size() - 1))
return next;
else
next->move2(track, index + 1);
}