题干分析:
让每个节点的next指针指向其右侧节点,如果右侧没有节点,则令next为NULL。
思路:
很明显需要对二叉树进行一层一层的遍历,即广度优先搜索,使用一个队列queue将每层的节点进行存储,在以此将同一层的节点相连,连接的同时将该节点的子节点加入queue,之后即可将该节点从queue中pop掉,由此即可实现对每一层节点的动态更新。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
public:
Node* connect(Node* root) {
queue<Node*> q;
q.push(root);
int len, i;
Node* temp;
while(!q.empty() && q.front()){
len = q.size();
for(i = 0; i < len; i ++){
temp = q.front();
q.pop();
if(i + 1 < len){
temp -> next = q.front();
}
if(temp -> left ){
q.push(temp -> left);
}
if(temp -> right){
q.push(temp -> right);
}
}
}
return root;
}
};
进阶解法:
由于每个节点都需要进行遍历,所以时间复杂度是O(N)无法优化,但可以对空间复杂度进行优化。
思路:
在上一层时将下一层进行连接,基于此,当我们到达下一层时只需要进行遍历即可,无需额外空间对该层节点进行维护。
class Solution {
public:
void next_layer(Node* &last, Node* &p, Node* &nextStart){
if(last){
last -> next = p;
}else{
nextStart = p;
}
last = p;
}
Node* connect(Node* root) {
Node* start = root;
Node* last = NULL;
Node* nextStart = NULL;
while(start){
for(Node* p = start; p != nullptr; p = p -> next){
if(p -> left){
next_layer(last, p -> left, nextStart);
}
if(p -> right){
next_layer(last, p -> right, nextStart);
}
}
start = nextStart;
last = nullptr;
nextStart = nullptr;
}
return root;
}
};