手写笔记
这道题比较简单
代码
我自己的代码,最初没想明白怎么链接不同节点的子节点,比如:节点5和节点6如何链接,所以用了个复制queue的操作,增加了时间复杂度。看了官方题解发现小丑竟是我自己,根本就不用纠结这个,因为每一次pop都可以链接得上,而且最后一个节点时初始化就是NULL。
/*
// 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) {
if(root){
queue<Node*> q;
q.push(root);
Node* curr;
int len = 2;
while(!q.empty()){
Node* temp = q.front();
if(temp){
// cout << temp->val << ' ';
q.push(temp->left);
q.push(temp->right);
}
q.pop();
if(q.size() == len){
queue<Node*> temp(q);
curr = temp.front();
temp.pop();
while(!temp.empty()){
if(temp.front()){
curr->next = temp.front();
curr = curr->next;
}
temp.pop();
}
len*=2;
}
}
}
return root;
}
};
官方题解
class Solution {
public:
Node* connect(Node* root) {
if (root == nullptr) {
return root;
}
// 初始化队列同时将第一层节点加入队列中,即根节点
queue<Node*> Q;
Q.push(root);
// 外层的 while 循环迭代的是层数
while (!Q.empty()) {
// 记录当前队列大小
int size = Q.size();
// 遍历这一层的所有节点
for(int i = 0; i < size; i++) {
// 从队首取出元素
Node* node = Q.front();
Q.pop();
// 连接
if (i < size - 1) {
node->next = Q.front();
}
// 拓展下一层节点
if (node->left != nullptr) {
Q.push(node->left);
}
if (node->right != nullptr) {
Q.push(node->right);
}
}
}
// 返回根节点
return root;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/solution/tian-chong-mei-ge-jie-dian-de-xia-yi-ge-you-ce-2-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。