1、递归
我们可以递归实现next指针的指向。当当前节点为空节点时,我们返回空指针。因为这是一棵完美二叉树,因此若有左节点则肯定有右节点。当存在左节点时,我们将左节点的next指针指向其右节点。而后我们判断当前根节点的next指针是否为空,若不为空则说明当前层还有节点没有遍历完,我们将当前根节点的右节点的next指针指向当前节点next节点的左节点。而后我们对当前节点的左节点和右节点递归调用函数,最终返回根节点即可。
class Solution {
public:
Node *connect(Node *root) {
if (!root) return nullptr;
if (root->left) {
root->left->next = root->right;
if (root->next) {
root->right->next = root->next->left;
}
}
connect(root->left);
connect(root->right);
return root;
}
};
2、迭代
具体思路同上。
class Solution {
public:
Node *connect(Node *root) {
if (root == nullptr) {
return root;
}
Node *leftmost = root;
while (leftmost->left != nullptr) {
Node *head = leftmost;
while (head != nullptr) {
head->left->next = head->right;
if (head->next != nullptr) {
head->right->next = head->next->left;
}
head = head->next;
}
leftmost = leftmost->left;
}
return root;
}
};