原题地址(中等)
方法1—队列+层次遍历
思路
用队列模拟层次遍历,再加一些处理,可以非常容易的做出来。
然并卵,我开始没看到题目的要求是空间需要常数级,所以这种用队列的做法,是不符合题意的。。。
代码
class Solution {public:Node* connect(Node* root) {if(!root) return NULL;queue<Node*> q;q.push(root);while(!q.empty()) {int count = q.size();Node* pre = NULL;while(count) {count--;Node* p = q.front();q.pop();if(pre) pre->next = p;pre = p;if(p->left) q.push(p->left);if(p->right) q.push(p->right);}}return root;}};
时间复杂度
空间复杂度
O(N) ,也就是队列的空间代价
方法2—利用next
思路
可以利用next指针来免去队列的空间存储
只要每次都能找到第 i 层的最左侧结点,并且预先把第 i 层的所有结点都连接起来,那么就可以遍历第 i 层。
我们就用这个思路,在遍历第 i-1 层的时候,把第 i 层都连接好,并且记录下第 i 层的第一个结点,这样就可以实现层次遍历了。
代码
class Solution {
public:
Node* connect(Node* root) {
Node* start = root;
while(start) {
Node* pre = NULL, *nextStart = NULL;
for(auto p = start; p != NULL; p = p->next) {
if(p->left) {
if(pre) pre->next = p->left;
pre = p->left;
if(!nextStart) nextStart = p->left;
}
if(p->right) {
if(pre) pre->next = p->right;
pre = p->right;
if(!nextStart) nextStart = p->right;
}
}
start = nextStart;
}
return root;
}
};
时间复杂度
空间复杂度
O(1)
