填充每個節點的下一個右側節點指標||(層序遍歷)
阿新 • • 發佈:2021-10-11
題目連結: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; } };