#include <iostream>
#include <stack>
 
struct leaf {
    public:
        int value;
        leaf* right;
        leaf* left;
        leaf* neighbor;
 
        leaf(int v, leaf* r, leaf* l) :
            value(v), right(r), left(l), neighbor(nullptr) {};
};
 
void find_neighbors(leaf* node, std::stack<leaf*> & stack)
{
    if (node == nullptr) {
        return;
    };
 
    if (!stack.empty()) {
        node->neighbor = stack.top();
        stack.pop();
    };
 
    find_neighbors(node->right, stack);
    find_neighbors(node->left, stack);
    stack.push(node);
 
    return;
}
 
void show_leaf(leaf* node)
{
	if (node == nullptr) {
		return;
	};
 
	std::cout << "Node: " << node->value << " neighbor: " << (node->neighbor != nullptr ? node->neighbor->value : 0) << std::endl;
 
	show_leaf(node->right);
	show_leaf(node->left);
 
	return;
}
 
int main()
{
	leaf* tree0 = new leaf(1, nullptr, nullptr);
 
	leaf* tree1 =
		new leaf(
			1,
			new leaf(3, nullptr, nullptr),
			new leaf(2, nullptr, nullptr)
		);
 
	leaf* tree2 =
		new leaf(
			1,
			new leaf(
				3,
				new leaf(7, nullptr, nullptr),
				new leaf(6, nullptr, nullptr)
			),
			new leaf(
				2,
				nullptr,
				new leaf(4, nullptr, nullptr)
			)
		);
 
	std::stack<leaf*> stack0;
	find_neighbors(tree0, stack0);
	std::cout << "Tree #0" << std::endl;
	std::cout << "(1)" << std::endl;
	show_leaf(tree0);
	std::cout << std::endl;
 
	std::stack<leaf*> stack1;
	find_neighbors(tree1, stack1);
	std::cout << "Tree #1" << std::endl;
	std::cout << "   (1)" << std::endl;
	std::cout << "  /   \\" << std::endl;
	std::cout << "(2)   (3)" << std::endl;
	show_leaf(tree1);
	std::cout << std::endl;
 
	std::stack<leaf*> stack2;
	find_neighbors(tree2, stack2);
	std::cout << "Tree #2" << std::endl;
	std::cout << "    (1)" << std::endl;
	std::cout << "    / \\" << std::endl;
	std::cout << "  (2)  (3)" << std::endl;
	std::cout << "  /    / \\" << std::endl;
	std::cout << "(4)  (6)  (7)" << std::endl;
	show_leaf(tree2);
	std::cout << std::endl;
 
	return 0;
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RhY2s+CgpzdHJ1Y3QgbGVhZiB7CiAgICBwdWJsaWM6CiAgICAgICAgaW50IHZhbHVlOwogICAgICAgIGxlYWYqIHJpZ2h0OwogICAgICAgIGxlYWYqIGxlZnQ7CiAgICAgICAgbGVhZiogbmVpZ2hib3I7CgogICAgICAgIGxlYWYoaW50IHYsIGxlYWYqIHIsIGxlYWYqIGwpIDoKICAgICAgICAgICAgdmFsdWUodiksIHJpZ2h0KHIpLCBsZWZ0KGwpLCBuZWlnaGJvcihudWxscHRyKSB7fTsKfTsKCnZvaWQgZmluZF9uZWlnaGJvcnMobGVhZiogbm9kZSwgc3RkOjpzdGFjazxsZWFmKj4gJiBzdGFjaykKewogICAgaWYgKG5vZGUgPT0gbnVsbHB0cikgewogICAgICAgIHJldHVybjsKICAgIH07CgogICAgaWYgKCFzdGFjay5lbXB0eSgpKSB7CiAgICAgICAgbm9kZS0+bmVpZ2hib3IgPSBzdGFjay50b3AoKTsKICAgICAgICBzdGFjay5wb3AoKTsKICAgIH07CgogICAgZmluZF9uZWlnaGJvcnMobm9kZS0+cmlnaHQsIHN0YWNrKTsKICAgIGZpbmRfbmVpZ2hib3JzKG5vZGUtPmxlZnQsIHN0YWNrKTsKICAgIHN0YWNrLnB1c2gobm9kZSk7CgogICAgcmV0dXJuOwp9Cgp2b2lkIHNob3dfbGVhZihsZWFmKiBub2RlKQp7CglpZiAobm9kZSA9PSBudWxscHRyKSB7CgkJcmV0dXJuOwoJfTsKCQoJc3RkOjpjb3V0IDw8ICJOb2RlOiAiIDw8IG5vZGUtPnZhbHVlIDw8ICIgbmVpZ2hib3I6ICIgPDwgKG5vZGUtPm5laWdoYm9yICE9IG51bGxwdHIgPyBub2RlLT5uZWlnaGJvci0+dmFsdWUgOiAwKSA8PCBzdGQ6OmVuZGw7CgkKCXNob3dfbGVhZihub2RlLT5yaWdodCk7CglzaG93X2xlYWYobm9kZS0+bGVmdCk7CgkKCXJldHVybjsKfQoKaW50IG1haW4oKQp7CglsZWFmKiB0cmVlMCA9IG5ldyBsZWFmKDEsIG51bGxwdHIsIG51bGxwdHIpOwoJCglsZWFmKiB0cmVlMSA9CgkJbmV3IGxlYWYoCgkJCTEsCgkJCW5ldyBsZWFmKDMsIG51bGxwdHIsIG51bGxwdHIpLAoJCQluZXcgbGVhZigyLCBudWxscHRyLCBudWxscHRyKQoJCSk7CgoJbGVhZiogdHJlZTIgPQoJCW5ldyBsZWFmKAoJCQkxLAoJCQluZXcgbGVhZigKCQkJCTMsCgkJCQluZXcgbGVhZig3LCBudWxscHRyLCBudWxscHRyKSwKCQkJCW5ldyBsZWFmKDYsIG51bGxwdHIsIG51bGxwdHIpCgkJCSksCgkJCW5ldyBsZWFmKAoJCQkJMiwKCQkJCW51bGxwdHIsCgkJCQluZXcgbGVhZig0LCBudWxscHRyLCBudWxscHRyKQoJCQkpCgkJKTsKCglzdGQ6OnN0YWNrPGxlYWYqPiBzdGFjazA7CglmaW5kX25laWdoYm9ycyh0cmVlMCwgc3RhY2swKTsKCXN0ZDo6Y291dCA8PCAiVHJlZSAjMCIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICIoMSkiIDw8IHN0ZDo6ZW5kbDsKCXNob3dfbGVhZih0cmVlMCk7CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCXN0ZDo6c3RhY2s8bGVhZio+IHN0YWNrMTsKCWZpbmRfbmVpZ2hib3JzKHRyZWUxLCBzdGFjazEpOwoJc3RkOjpjb3V0IDw8ICJUcmVlICMxIiA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIiAgICgxKSIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICIgIC8gICBcXCIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICIoMikgICAoMykiIDw8IHN0ZDo6ZW5kbDsKCXNob3dfbGVhZih0cmVlMSk7CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoKCXN0ZDo6c3RhY2s8bGVhZio+IHN0YWNrMjsKCWZpbmRfbmVpZ2hib3JzKHRyZWUyLCBzdGFjazIpOwoJc3RkOjpjb3V0IDw8ICJUcmVlICMyIiA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIiAgICAoMSkiIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiICAgIC8gXFwiIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCAiICAoMikgICgzKSIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICIgIC8gICAgLyBcXCIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICIoNCkgICg2KSAgKDcpIiA8PCBzdGQ6OmVuZGw7CglzaG93X2xlYWYodHJlZTIpOwoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCglyZXR1cm4gMDsKfQ==