leetcode日记(101)填充每个节点的下一个右侧节点指针Ⅱ
意料之中有这题,将之前的思路换一下即可,层序遍历的思路将record(记录下一个循环的次数)手动加减。
/*
// 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==NULL) return root;
queue<Node*> q;
q.push(root);
int frequency=1;
while(!q.empty()){
int record=0;
Node* n=NULL;
for(int i=0;i<frequency;i++){
Node* first=q.front();
if(first->left){
q.push(first->left);
record++;
}
if(first->right){
q.push(first->right);
record++;
}
if(n) n->next=first;
n=first;
q.pop();
record--;
}
frequency+=record;
}
return root;
}
};
递归方法也差不多,只要"稍改"一点即可。
/*
// 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) {
Node* result=root;
while(root){
Node* record=root->left?root->left:root->right;
Node* last=NULL;
Node* next=NULL;
while(root){
if(root->right&&root->left){root->left->next=root->right;}
else if(root->right==NULL&&root->left==NULL){
root=root->next;
if(record==NULL&&root) record=root->left?root->left:root->right;
continue;
}
next=root->left?root->left:root->right;
if(last&&next) last->next=next;
last=root->right?root->right:root->left;
root=root->next;
}
root=record;
}
return result;
}
};
递归的很容易出错,还是用前面那种方法更好。