1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> #include <map> #include <vector> class Tree { public: explicit Tree(int value) : _root(NULL), _left(NULL), _right(NULL), _sibling(NULL), _nodeValue(value) {} ~Tree() { if (_left) delete _left; if (_right) delete _right; } Tree* root() const { return _root; } Tree* left_subtree() const { return _left; } Tree* right_subtree() const { return _right; } Tree* sibling() const { return _sibling; } int value() const { return _nodeValue; } Tree* setLeft(Tree* t) { t->_root = this; return _left = t; } Tree* setRight(Tree* t) { t->_root = this; return _right = t; } void connect(Tree* s) { _sibling = s; } private: Tree* _root; Tree* _left; Tree* _right; Tree* _sibling; int _nodeValue; }; typedef std::map<int, std::vector<Tree*> > nodes_by_level; void join_siblings(int level, Tree* t, nodes_by_level& nodes) { if (!t) return; nodes[level].push_back(t); join_siblings(level + 1, t->left_subtree(), nodes); join_siblings(level + 1, t->right_subtree(), nodes); } nodes_by_level join_siblings(Tree& t) { nodes_by_level nodes; join_siblings(0, &t, nodes); return nodes; } void printSiblings(Tree* t) { if (!t) return; if (t->sibling()) std::cout << "The sibling of " << t->value() << " is " << t->sibling()->value() << std::endl; printSiblings(t->left_subtree()); printSiblings(t->right_subtree()); } int main() { Tree t(1); Tree* two = t.setLeft(new Tree(2)); Tree* three = t.setRight(new Tree(3)); Tree* four = two->setLeft(new Tree(4)); two->setRight(new Tree(5)); Tree* six = three->setRight(new Tree(6)); four->setLeft(new Tree(7)); six->setRight(new Tree(8)); nodes_by_level nl = join_siblings(t); std::cout << "Connected nodes: \n"; for (nodes_by_level::iterator it = nl.begin(); it != nl.end(); ++it) { std::vector<Tree*>& v = it->second; for (size_t i = 0; i < v.size(); ++i) { if (i < v.size() - 1) v[i]->connect(v[i+1]); } } printSiblings(&t); return 0; } |
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgVHJlZSB7CnB1YmxpYzoKICAgIGV4cGxpY2l0IFRyZWUoaW50IHZhbHVlKSA6IF9yb290KE5VTEwpLCBfbGVmdChOVUxMKSwgX3JpZ2h0KE5VTEwpLCBfc2libGluZyhOVUxMKSwgX25vZGVWYWx1ZSh2YWx1ZSkge30KICAgIH5UcmVlKCkgeyBpZiAoX2xlZnQpIGRlbGV0ZSBfbGVmdDsgaWYgKF9yaWdodCkgZGVsZXRlIF9yaWdodDsgfQogICAgVHJlZSogcm9vdCgpIGNvbnN0IHsgcmV0dXJuIF9yb290OyB9CiAgICBUcmVlKiBsZWZ0X3N1YnRyZWUoKSBjb25zdCB7IHJldHVybiBfbGVmdDsgfQogICAgVHJlZSogcmlnaHRfc3VidHJlZSgpIGNvbnN0IHsgcmV0dXJuIF9yaWdodDsgfQogICAgVHJlZSogc2libGluZygpIGNvbnN0IHsgcmV0dXJuIF9zaWJsaW5nOyB9CiAgICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBfbm9kZVZhbHVlOyB9ICAgIAogICAgVHJlZSogc2V0TGVmdChUcmVlKiB0KSB7IHQtPl9yb290ID0gdGhpczsgcmV0dXJuIF9sZWZ0ID0gdDsgfQogICAgVHJlZSogc2V0UmlnaHQoVHJlZSogdCkgeyB0LT5fcm9vdCA9IHRoaXM7IHJldHVybiBfcmlnaHQgPSB0OyB9CiAgICB2b2lkIGNvbm5lY3QoVHJlZSogcykgeyBfc2libGluZyA9IHM7IH0KcHJpdmF0ZToKICAgIFRyZWUqIF9yb290OwogICAgVHJlZSogX2xlZnQ7CiAgICBUcmVlKiBfcmlnaHQ7CiAgICBUcmVlKiBfc2libGluZzsKICAgIGludCBfbm9kZVZhbHVlOyAgICAKfTsKCnR5cGVkZWYgc3RkOjptYXA8aW50LCBzdGQ6OnZlY3RvcjxUcmVlKj4gPiBub2Rlc19ieV9sZXZlbDsKCnZvaWQgam9pbl9zaWJsaW5ncyhpbnQgbGV2ZWwsIFRyZWUqIHQsIG5vZGVzX2J5X2xldmVsJiBub2RlcykgewogICAgaWYgKCF0KSByZXR1cm47CiAgICBub2Rlc1tsZXZlbF0ucHVzaF9iYWNrKHQpOwogICAgam9pbl9zaWJsaW5ncyhsZXZlbCArIDEsIHQtPmxlZnRfc3VidHJlZSgpLCBub2Rlcyk7CiAgICBqb2luX3NpYmxpbmdzKGxldmVsICsgMSwgdC0+cmlnaHRfc3VidHJlZSgpLCBub2Rlcyk7Cn0KCm5vZGVzX2J5X2xldmVsIGpvaW5fc2libGluZ3MoVHJlZSYgdCkgewogIG5vZGVzX2J5X2xldmVsIG5vZGVzOwogIGpvaW5fc2libGluZ3MoMCwgJnQsIG5vZGVzKTsKICByZXR1cm4gbm9kZXM7Cn0KCnZvaWQgcHJpbnRTaWJsaW5ncyhUcmVlKiB0KSB7CiAgICBpZiAoIXQpIHJldHVybjsKICAgIGlmICh0LT5zaWJsaW5nKCkpIHN0ZDo6Y291dCA8PCAiVGhlIHNpYmxpbmcgb2YgIiA8PCB0LT52YWx1ZSgpIDw8ICIgaXMgIiA8PCB0LT5zaWJsaW5nKCktPnZhbHVlKCkgPDwgc3RkOjplbmRsOwogICAgcHJpbnRTaWJsaW5ncyh0LT5sZWZ0X3N1YnRyZWUoKSk7CiAgICBwcmludFNpYmxpbmdzKHQtPnJpZ2h0X3N1YnRyZWUoKSk7Cn0KCmludCBtYWluKCkgewogICAgVHJlZSB0KDEpOwogICAgVHJlZSogdHdvID0gdC5zZXRMZWZ0KG5ldyBUcmVlKDIpKTsKICAgIFRyZWUqIHRocmVlID0gdC5zZXRSaWdodChuZXcgVHJlZSgzKSk7CiAgICBUcmVlKiBmb3VyID0gdHdvLT5zZXRMZWZ0KG5ldyBUcmVlKDQpKTsKICAgIHR3by0+c2V0UmlnaHQobmV3IFRyZWUoNSkpOwogICAgVHJlZSogc2l4ID0gdGhyZWUtPnNldFJpZ2h0KG5ldyBUcmVlKDYpKTsKICAgIGZvdXItPnNldExlZnQobmV3IFRyZWUoNykpOwogICAgc2l4LT5zZXRSaWdodChuZXcgVHJlZSg4KSk7CgogICAgbm9kZXNfYnlfbGV2ZWwgbmwgPSBqb2luX3NpYmxpbmdzKHQpOwoKICAgIHN0ZDo6Y291dCA8PCAiQ29ubmVjdGVkIG5vZGVzOiBcbiI7CgogICAgZm9yIChub2Rlc19ieV9sZXZlbDo6aXRlcmF0b3IgaXQgPSBubC5iZWdpbigpOwogICAgICAgICBpdCAhPSBubC5lbmQoKTsKICAgICAgICAgKytpdCkgewogICAgICAgIHN0ZDo6dmVjdG9yPFRyZWUqPiYgdiA9IGl0LT5zZWNvbmQ7CiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgIGlmIChpIDwgdi5zaXplKCkgLSAxKSB2W2ldLT5jb25uZWN0KHZbaSsxXSk7CiAgICAgICAgfQogICAgfQoKICAgIHByaW50U2libGluZ3MoJnQpOwoKICAgIHJldHVybiAwOwp9Cg==
-
upload with new input
-
result: Success time: 0.01s memory: 2860 kB returned value: 0
Connected nodes: The sibling of 2 is 3 The sibling of 4 is 5 The sibling of 7 is 8 The sibling of 5 is 6


