1. 层次遍历 层次遍历获得同一层的节点,然后依次让next指向右侧的节点。 时间O(n)
,空间O(n)
。
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 class Solution {public : Node* connect (Node* root) { if (root == nullptr ) return nullptr ; queue<Node*> q; Node* cur = root; q.push (cur); while (!q.empty ()) { int n = q.size (); while (n-- > 0 ) { cur = q.front (); q.pop (); if (cur->left != nullptr ) q.push (cur->left); if (cur->right != nullptr ) q.push (cur->right); if (n > 0 ) cur->next = q.front (); } } return root; } };
2. 迭代 通过上一层已经构造好的next指针获取下一层新的节点,并不断修改下一层节点的next值。 时间O(n)
,空间O(1)
。
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 class Solution {public : Node* connect (Node* root) { if (root == nullptr ) return nullptr ; Node* lastLayer = root; Node* cur = nullptr ; curHead = nullptr ; while (lastLayer != nullptr ) { while (lastLayer != nullptr ) { if (lastLayer->left != nullptr ) { if (cur == nullptr ) { cur = lastLayer->left; curHead = cur; } else { cur->next = lastLayer->left; cur = cur->next; } } if (lastLayer->right != nullptr ) { if (cur == nullptr ) { cur = lastLayer->right; curHead = cur; } else { cur->next = lastLayer->right; cur = cur->next; } } lastLayer = lastLayer->next; } cur = nullptr ; lastLayer = curHead; curHead = nullptr ; } return root; } };