意料之中有这题,将之前的思路换一下即可,层序遍历的思路将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;}
};
递归的很容易出错,还是用前面那种方法更好。