https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
1.递归-对每层新建一个外部节点,用于将每层串起来。由于所有节点的next初始化为null,因此对于最右侧的节点不作处理。
/*
// 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) {
if(root==nullptr) return root;
Node out(-1);
for(Node* cur=root, *p=&out; cur!=nullptr;cur=cur->next){
if(cur->left!=nullptr){
p->next = cur->left;
p = p->next;
}
if(cur->right!=nullptr){
p->next = cur->right;
p = p->next;
}
}
connect(out.next);
return root;
}
};
2.非递归-双队列法
/*
// 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) {
if(root==nullptr) return root;
queue<Node*> a, b;
a.push(root);
while(!a.empty() || !b.empty()){
while(!a.empty()){
Node* tmp = a.front();
a.pop();
if(a.empty())
tmp->next = nullptr;
else
tmp->next = a.front();
if(tmp->left!=nullptr)
b.push(tmp->left);
if(tmp->right!=nullptr)
b.push(tmp->right);
}
while(!b.empty()){
Node* tmp = b.front();
b.pop();
if(b.empty())
tmp->next = nullptr;
else
tmp->next = b.front();
if(tmp->left!=nullptr)
a.push(tmp->left);
if(tmp->right!=nullptr)
a.push(tmp->right);
}
}
return root;
}
};