要求:把每层用next指针连起来,空间O(1)
思路:每层都从最左边的开始,左孩子指右孩子,右孩子指next的左孩子
/*
// 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* leftmost = root;
while (leftmost->left != nullptr) {
// 遍历这一层节点组织成的链表,为下一层的节点更新 next 指针
Node* head = leftmost;
while (head != nullptr) {
// CONNECTION 1
head->left->next = head->right;
// CONNECTION 2
if (head->next != nullptr) {
head->right->next = head->next->left;
}
// 指针向后移动
head = head->next;
}
// 去下一层的最左的节点
leftmost = leftmost->left;
}
return root;
}
};
递归前序为什么可以?因为处理右孩子时当前根的next必然已经连过了
class Solution {
public:
Node* connect(Node* root) {
if(!root)return nullptr;
if(root->left)root->left->next=root->right;
if(root->right&&root->next)root->right->next=root->next->left;
connect(root->left);
connect(root->right);
return root;
}
};