题目

image.png

解法

使用外部数据结构

  1. Node* connect(Node* root) {
  2. if (root == nullptr) {
  3. return nullptr;
  4. }
  5. queue<Node*> que;
  6. que.push(root);
  7. while (!que.empty()) {
  8. int len = que.size();
  9. Node* preNode, *node;
  10. for (int i = 0; i < len; ++i) {
  11. if (i == 0) {
  12. preNode = que.front();
  13. que.pop();
  14. node = preNode;
  15. } else {
  16. node = que.front();
  17. que.pop();
  18. preNode->next = node;
  19. preNode = node;
  20. }
  21. if (node->left) {
  22. que.push(node->left);
  23. }
  24. if (node->right) {
  25. que.push(node->right);
  26. }
  27. }
  28. node->next = nullptr;
  29. }
  30. return root;
  31. }

不使用外部数据结构-递归

  1. void connectTwo(Node* node1, Node* node2) {
  2. if (node1 == nullptr || node2 == nullptr) {
  3. reutrn;
  4. }
  5. node1->next = node2;
  6. connectTwo(node1->left, node1->right);
  7. connectTwo(node2->left, node2->right);
  8. connectTwo(node1->right, node2->left);
  9. }
  10. Node* connect(Node* root) {
  11. if (root == nullptr) {
  12. return nullptr;
  13. }
  14. connectTwo(root->left, root->right):
  15. return root;
  16. }

不使用外部数据结构-迭代

  1. Node* connect(Node* root) {
  2. if (root == nullptr) {
  3. return nullptr;
  4. }
  5. Node* cur = root;
  6. while (cur->left != nullptr) {
  7. Node* pre = cur;
  8. while (pre != nullptr) {
  9. pre->left->next = pre->right;
  10. if (pre->next != nullptr) {
  11. pre->right->next = pre->next->left;
  12. }
  13. pre = pre->next;
  14. }
  15. cur = cur->left;
  16. }
  17. return root;
  18. }