1. 程式人生 > 其它 >填充每個節點的下一個右側節點指標||(層序遍歷)

填充每個節點的下一個右側節點指標||(層序遍歷)

題目連結:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/
題目描述:
給定一個二叉樹

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每個 next 指標,讓這個指標指向其下一個右側節點。如果找不到下一個右側節點,則將 next 指標設定為 NULL。
初始狀態下,所有next 指標都被設定為 NULL。

進階:
你只能使用常量級額外空間。
使用遞迴解題也符合要求,本題中遞迴程式佔用的棧空間不算做額外的空間複雜度。

示例:

輸入:root = [1,2,3,4,5,null,7]
輸出:[1,#,2,3,#,4,5,7,#]
解釋:給定二叉樹如圖 A 所示,你的函式應該填充它的每個 next 指標,以指向其下一個右側節點,如圖 B 所示。序列化輸出按層序遍歷順序(由 next 指標連線),'#' 表示每層的末尾。

提示:
樹中的節點數小於 6000
-100<= node.val <= 100

題解:

/*
// 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* > que;
        if(root)
            que.push(root);
        while(!que.empty())
        {
            int size = que.size();
            Node* nodePre;
            Node* node;
            for(int i = 0; i < size; i++)
            {
                if(i == 0)      //本層的第一個節點
                {
                    nodePre = que.front();
                    que.pop();
                    node = nodePre;
                }else           
                {
                    node = que.front();
                    que.pop();
                    nodePre->next = node;
                    nodePre = nodePre->next;
                }
                if(node->left)
                    que.push(node->left);
                if(node->right)
                    que.push(node->right);

            }
            node->next = NULL;          //本層最後一個節點
        }
        return root;
        
    }
};