#include <iostream>
template <typename T>
struct Node {
T value;
Node<T> *left, *right, *next_sibling;
};
template <typename T>
void link_siblings(Node<T> *root) {
// * -> * <upper
// / \
// * -> * <lower
// ^ level_start
Node<T> *upper = root, *lower = nullptr, *level_start = nullptr;
while (upper) {
for (auto child : {upper->left, upper->right}) {
if (child) {
if (lower) lower->next_sibling = child;
else level_start = child;
lower = child;
}
}
if (upper->next_sibling) {
upper = upper->next_sibling;
} else {
upper = level_start;
level_start = lower = nullptr;
}
}
}
int main() {
// 0
// 1 4
// 2 3 5
constexpr int N = 6;
Node<int> nodes[N];
int lchildren[N] = {1, 2, -1, -1, -1, -1};
int rchildren[N] = {4, 3, -1, -1, 5, -1};
for (int i = 0; i < N; i++) {
nodes[i].value = i;
nodes[i].left = nodes[i].right = nodes[i].next_sibling = nullptr;
if (lchildren[i] >= 0) nodes[i].left = &nodes[lchildren[i]];
if (rchildren[i] >= 0) nodes[i].right = &nodes[rchildren[i]];
}
link_siblings(&nodes[0]);
for (int i = 0; i < N; i++) {
auto sibling = nodes[i].next_sibling;
int sibling_value = sibling ? (sibling->value) : -1;
std::cout << nodes[i].value << " => " << sibling_value << "\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBOb2RlIHsKICAgIFQgdmFsdWU7CiAgICBOb2RlPFQ+ICpsZWZ0LCAqcmlnaHQsICpuZXh0X3NpYmxpbmc7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBsaW5rX3NpYmxpbmdzKE5vZGU8VD4gKnJvb3QpIHsKICAgIC8vICAgKiAtPiAqIDx1cHBlcgogICAgLy8gLyAgIFwKICAgIC8vICogLT4gKiA8bG93ZXIKICAgIC8vIF4gbGV2ZWxfc3RhcnQKICAgIE5vZGU8VD4gKnVwcGVyID0gcm9vdCwgKmxvd2VyID0gbnVsbHB0ciwgKmxldmVsX3N0YXJ0ID0gbnVsbHB0cjsKICAgIHdoaWxlICh1cHBlcikgewogICAgICAgIGZvciAoYXV0byBjaGlsZCA6IHt1cHBlci0+bGVmdCwgdXBwZXItPnJpZ2h0fSkgewogICAgICAgICAgICBpZiAoY2hpbGQpIHsKICAgICAgICAgICAgICAgIGlmIChsb3dlcikgbG93ZXItPm5leHRfc2libGluZyA9IGNoaWxkOwogICAgICAgICAgICAgICAgZWxzZSAgICAgICBsZXZlbF9zdGFydCAgICAgICAgID0gY2hpbGQ7CiAgICAgICAgICAgICAgICBsb3dlciA9IGNoaWxkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodXBwZXItPm5leHRfc2libGluZykgewogICAgICAgICAgICB1cHBlciA9IHVwcGVyLT5uZXh0X3NpYmxpbmc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXBwZXIgPSBsZXZlbF9zdGFydDsKICAgICAgICAgICAgbGV2ZWxfc3RhcnQgPSBsb3dlciA9IG51bGxwdHI7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIC8vICAgICAgICAwCiAgICAvLyAgIDEgICAgICAgIDQKICAgIC8vIDIgICAzICAgICAgICAgNQogICAgY29uc3RleHByIGludCBOID0gNjsKICAgIE5vZGU8aW50PiBub2Rlc1tOXTsKICAgIGludCBsY2hpbGRyZW5bTl0gPSB7MSwgIDIsIC0xLCAtMSwgLTEsIC0xfTsKICAgIGludCByY2hpbGRyZW5bTl0gPSB7NCwgIDMsIC0xLCAtMSwgIDUsIC0xfTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgbm9kZXNbaV0udmFsdWUgPSBpOwogICAgICAgIG5vZGVzW2ldLmxlZnQgPSBub2Rlc1tpXS5yaWdodCA9IG5vZGVzW2ldLm5leHRfc2libGluZyA9IG51bGxwdHI7CiAgICAgICAgaWYgKGxjaGlsZHJlbltpXSA+PSAwKSBub2Rlc1tpXS5sZWZ0ICA9ICZub2Rlc1tsY2hpbGRyZW5baV1dOwogICAgICAgIGlmIChyY2hpbGRyZW5baV0gPj0gMCkgbm9kZXNbaV0ucmlnaHQgPSAmbm9kZXNbcmNoaWxkcmVuW2ldXTsKICAgIH0KICAgIGxpbmtfc2libGluZ3MoJm5vZGVzWzBdKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgYXV0byBzaWJsaW5nID0gbm9kZXNbaV0ubmV4dF9zaWJsaW5nOwogICAgICAgIGludCBzaWJsaW5nX3ZhbHVlID0gc2libGluZyA/IChzaWJsaW5nLT52YWx1ZSkgOiAtMTsKICAgICAgICBzdGQ6OmNvdXQgPDwgbm9kZXNbaV0udmFsdWUgPDwgIiA9PiAiIDw8IHNpYmxpbmdfdmFsdWUgPDwgIlxuIjsKICAgIH0KICAgIHJldHVybiAwOwp9