116. 填充每个节点的下一个右侧节点指针和117. 填充每个节点的下一个右侧节点指针 II这两个题目唯一的区别在于是否是完美二叉树。
这个题目的思路完全来源于层次遍历,如果掌握了层次遍历,这两个题目的答案都是一样的。
源代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() {}
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) return nullptr;
que.push_back(root);
Node* nod;
while(que.size()) {
for(auto iter = que.begin(); iter != que.end(); ++iter) {
if(iter + 1 == que.end())
(*iter)->next = nullptr;
else
(*iter)->next = *(iter+1);
}
while(que.size()) {
nod = que.front();
que.pop_front();
if(nod->left)
child_que.push_back(nod->left);
if(nod->right)
child_que.push_back(nod->right);
}
que.swap(child_que);
}
return root;
}
private:
deque<Node*> que,child_que;
};