原题地址(中等)
方法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)