题目

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. preNode->next = node;
  18. preNode = node;
  19. }
  20. if (node->left) {
  21. que.push(node->left);
  22. }
  23. if (node->right) {
  24. que.push(node->right);
  25. }
  26. }
  27. node->next = nullptr;
  28. }
  29. return root;
  30. }

不使用外部数据结构

  1. Node* connect(Node* root) {
  2. if (root == nullptr) {
  3. return nullptr;
  4. }
  5. // 建立一个节点作为每层链表的头节点
  6. Node* dummay = new Node(-1);
  7. Node* cur = root;
  8. while (cur != nullptr) {
  9. // 每层都是一个新的头节点,否则 pre 就不指向新的头节点
  10. dummay->next = nullptr;
  11. Node* pre = dummay;
  12. while (cur != nullptr) {
  13. if (cur->left) {
  14. pre->next = cur->left;
  15. pre = pre->next;
  16. }
  17. if (cur->right) {
  18. pre->next = cur->right;
  19. pre = pre->next;
  20. }
  21. cur = cur->next;
  22. }
  23. // 将虚拟头指针指向下一层
  24. cur = dummay->next;
  25. }
  26. reutrn root;
  27. }