WEI-CHENG CHEN

解法:

解法 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 指針:

  1. 情況 01 是同一個父節點連接兩個子節點,此時要做的是node.left.next = node.right

upgit_20250708_1751960762.png

  1. 情況 01 是不同個父節點要連接兩個子節點,此時要做的是:if (cur->next): cur->right->next = cur->next->left;

upgit_20250708_1751960991.png

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;
    }
};