1. 题目
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
类似题目:LeetCode 116
2. 解题
2.1 递归
左节点:
-
root有左节点和右节点,则左节点的next为右节点
-
root右节点为null,则查找父节点的兄弟节点的最左边子元素
右节点:
- root右节点不为null,其next为父节点的兄弟节点的最左边子元素
递归:要先构建右子树,再构建左子树,因为寻找父节点的兄弟节点是从左到右遍历的,如果右子树next没接上就遍历,会出错
class Solution {
public:
Node* connect(Node* root) {
if(root == NULL)
return root;
if(root->left)
{
if(root->right)
root->left->next = root->right;
else
root->left->next = findchild(root);
}
if(root->right)
root->right->next = findchild(root);
connect(root->right);
connect(root->left);
return root;
}
Node* findchild(Node* root)
{
if(root->next == NULL)
return NULL;
while(root->next)
{
if(root->next->left)
return root->next->left;
if(root->next->right)
return root->next->right;
root = root->next;
}
return NULL;
}
};
2.2 queue循环
以下代码也可以解LeetCode 116
class Solution {
public:
Node* connect(Node* root) {
if(root == NULL)
return root;
queue<Node*> q;
q.push(root);
Node *p;
int n;
while(!q.empty())
{
n = q.size();
while(n--)
{
p = q.front();
q.pop();
if(n)
p->next = q.front();
if(p->left)
q.push(p->left);
if(p->right)
q.push(p->right);
}
}
return root;
}
};
2.3 利用next循环
class Solution {
public:
Node* connect(Node* root) {
if(root == NULL)
return root;
Node *parent = root, *prev, *tmp;
while(parent)
{
while(parent && !parent->left && !parent->right)
parent = parent->next;//找到第一个有子的节点parent
if(parent == NULL)
break;
prev = NULL;
tmp = parent;
while(tmp) //遍历parent层,将其下层连接
{
if(tmp->left)
{
if(prev)
prev->next = tmp->left;
prev = tmp->left;
}
if(tmp->right)
{
if(prev)
prev->next = tmp->right;
prev = tmp->right;
}
tmp = tmp->next;
}
parent = parent->left ? parent->left : parent->right;
//parent移向下一层
}
return root;
}
};