【题目概要】
116. 填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
【思路分析】
- 通过head来连接,两部分,一部分自己内部子树的连接,一部分和head->next子树之间的连接,设置外部的循环leftnode,leftnode的left为NULL时,代表循环结束,内部建立从左到右的开始节点start=leftnode,循环至start=NULL
- 通过队列的方式来做,将每一行存入队列中,并且将每一行的节点按照个数循环,同时将next指针连接
【代码参考1】
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *left;
* struct Node *right;
* struct Node *next;
* };
*/
struct Node* connect(struct Node* root) {
struct Node* leftnode = root;
while(leftnode->left)
{
//代表是从root开始的每一行的起点,最终是比深度小1
struct Node *start = leftnode;
while(start)
{
start->left->next = start->right;
if(start->next)
{
start->right->next = start->next->left;
}
start = start->next;
}
leftnode = leftnode->left;
}
return root;
}
【代码示例2】
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *left;
* struct Node *right;
* struct Node *next;
* };
*/
typedef struct Queue{
struct Node* queue[10000];
int front;
int rear;
}Queue, *pQueue;
void InitQueue(pQueue Q)
{
Q->front = 0;
Q->rear = 0;
}
int IsEmpty(pQueue Q)
{
if(Q->rear == Q->front)
return 1;
else
return 0;
}
int IsFull(pQueue Q)
{
if((Q->rear+1)%10000 == Q->front)
return 1;
else
return 0;
}
void EnQueue(pQueue Q, struct Node* P)
{
Q->queue[Q->rear++] = P;
}
struct Node* DeQueue(pQueue Q)
{
return Q->queue[Q->front++];
}
int CountQueue(pQueue Q)
{
return (Q->rear-Q->front+10000)%10000;
}
struct Node* FrontQueue(pQueue Q)
{
return Q->queue[Q->front];
}
struct Node* connect(struct Node* root) {
if(root != NULL)
{
Queue QTree;
InitQueue(&QTree);
// 问题所在处
EnQueue(&QTree, root);
while(!IsEmpty(&QTree))
{
int count = CountQueue(&QTree);
for(int i=1; i <= count; i++)
{
//先保留当前的最开始值
struct Node* pcur = FrontQueue(&QTree);
//删除当前的最开始值
DeQueue(&QTree);
if(i == count)
pcur->next = NULL;
else
//获取当前节点同行的下一个节点
//并不会删除下一个节点,而是在下一次的遍历中又将其设置为首节点,因此不需要自己更换首节点
pcur->next = FrontQueue(&QTree);
//保存下一列的值
if(pcur->left)
EnQueue(&QTree, pcur->left);
if(pcur->right)
EnQueue(&QTree, pcur->right);
}
}
}
return root;
}