题目:
思路:
层序遍历。节点分两种:
- 非尾节点。其next指针指向本层的下一个节点。
- 尾节点。其next指针指向nullptr。
写完代码我发现,这个树是一个完美二叉树。利用这个性质会不会更容易些?但我没有想到怎么用它。
代码实现:
/*
// 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 == nullptr){
return nullptr;
}
queue<Node*> q;
q.push(root);
int cur_len = 1;
int next_len = 0;
while (!q.empty()){
Node *node = q.front();
q.pop();
--cur_len;
if (node->left != nullptr){
q.push(node->left);
++next_len;
}
if (node->right != nullptr){
q.push(node->right);
++next_len;
}
if (cur_len <= 0){
node->next = nullptr;
cur_len = next_len;
next_len = 0;
}else{
node->next = q.front();
}
}
return root;
}
};
discuss:
// 只沿最左路往下走,一层一层地处理
class Solution {
public:
Node* connect(Node* root) {
if (!root) return nullptr;
Node *pre = root;
Node *cur = NULL;
while (pre->left){
cur = pre;
while (cur){ // 处理cur(pre)所在的那一层节点,及其左右子节点
cur->left->next = cur->right; // 同一cur下点子节点
if (cur->next) cur->right->next = cur->next->left; // 不同cur下的子节点
cur = cur->next;
}
pre = pre->left; // 只需要沿着最左路往下走即可
}
return root;
}
};