1. 题目
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL
2. 解题
2.1 递归
class Solution {
public:
Node* connect(Node* root) {
if(root == NULL || root->left == NULL)
return root;
root->left->next = root->right;
if(root->next != NULL)
root->right->next = root->next->left;
connect(root->left);
connect(root->right);
return root;
}
};
2.2 循环
class Solution {
public:
Node* connect(Node* root) {
if(root == NULL || root->left == NULL)
return root;
queue<Node*> q;
q.push(root);
Node *p;
int n;
while(!q.empty())
{
n = q.size();
while(n--)
{
p = q.front();
if(p->left != NULL)
{
q.push(p->left);
q.push(p->right);
p->left->next = p->right;
if(p->next != NULL)
p->right->next = p->next->left;
}
q.pop();
}
}
return root;
}
};
2.3 O(1)空间复杂度
- 利用next指针
class Solution {
public:
Node* connect(Node* root) {
if(root == NULL || root->left == NULL)
return root;
Node *parent = root, *lvfirst, *prev;
while(parent != NULL)
{
lvfirst = parent->left;
if(lvfirst != NULL)
{
while(parent)
{
parent->left->next = parent->right;
prev = parent->right;
parent = parent->next;
if(parent)
prev->next = parent->left;
}
}
parent = lvfirst;
}
return root;
}
};