fork download
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. struct Node {
  5. T value;
  6. Node<T> *left, *right, *next_sibling;
  7. };
  8.  
  9. template <typename T>
  10. void link_siblings(Node<T> *root) {
  11. // * -> * <upper
  12. // / \
  13.   // * -> * <lower
  14. // ^ level_start
  15. Node<T> *upper = root, *lower = nullptr, *level_start = nullptr;
  16. while (upper) {
  17. for (auto child : {upper->left, upper->right}) {
  18. if (child) {
  19. if (lower) lower->next_sibling = child;
  20. else level_start = child;
  21. lower = child;
  22. }
  23. }
  24.  
  25. if (upper->next_sibling) {
  26. upper = upper->next_sibling;
  27. } else {
  28. upper = level_start;
  29. level_start = lower = nullptr;
  30. }
  31. }
  32. }
  33.  
  34. int main() {
  35. // 0
  36. // 1 4
  37. // 2 3 5
  38. constexpr int N = 6;
  39. Node<int> nodes[N];
  40. int lchildren[N] = {1, 2, -1, -1, -1, -1};
  41. int rchildren[N] = {4, 3, -1, -1, 5, -1};
  42. for (int i = 0; i < N; i++) {
  43. nodes[i].value = i;
  44. nodes[i].left = nodes[i].right = nodes[i].next_sibling = nullptr;
  45. if (lchildren[i] >= 0) nodes[i].left = &nodes[lchildren[i]];
  46. if (rchildren[i] >= 0) nodes[i].right = &nodes[rchildren[i]];
  47. }
  48. link_siblings(&nodes[0]);
  49. for (int i = 0; i < N; i++) {
  50. auto sibling = nodes[i].next_sibling;
  51. int sibling_value = sibling ? (sibling->value) : -1;
  52. std::cout << nodes[i].value << " => " << sibling_value << "\n";
  53. }
  54. return 0;
  55. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
0 => -1
1 => 4
2 => 3
3 => 5
4 => -1
5 => -1