解法 01:BFS
class Solution {
public:
Node* connect(Node* root) {
if (!root) return nullptr;
queue<Node*> q;
q.push(root);
while(!q.empty()){
int n = q.size();
Node* temp = nullptr;
for(int i=0;i<n;i++){
Node* node = q.front();
q.pop();
// 做連接
if(temp==nullptr) temp = node;
else{
temp->next = node;
temp = temp->next;
}
// BFS往下遞迴
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
return root;
}
};
解法 02:直接去修改指針
class Solution {
public:
Node* connect(Node* root) {
if (!root) return nullptr;
// 從root開始從新修改整個指真的走向
Node* cur = root;
while(cur->left){ // 只處理有左右孩子的節點 (不可以到子傑點)
Node* temp = cur;
while(temp){
// 第一種情況:
temp->left->next = temp->right;
// 第二種情況:
if(temp->next){
temp->right->next = temp->next->left;
}
temp = temp->next;
}
// 到下一層處裡
cur = cur->left;
}
return root;
}
};
解法 02:直接去修改指針
一棵樹中,從在兩種類型的 next 指針:
node.left.next = node.right
if (cur->next): cur->right->next = cur->next->left;
class Solution {
public:
Node* connect(Node* root) {
if (!root) return nullptr;
// 從root開始從新修改整個指真的走向
Node* cur = root;
while(cur->left){ // 只處理有左右孩子的節點 (不可以到子傑點)
Node* temp = cur;
while(temp){
// 第一種情況:
temp->left->next = temp->right;
// 第二種情況:
if(temp->next){
temp->right->next = temp->next->left;
}
temp = temp->next;
}
// 到下一層處裡
cur = cur->left;
}
return root;
}
};