leetcode系列116-填充每个节点的下一个右侧节点指针

【题目概要】

116. 填充每个节点的下一个右侧节点指针

给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL

在这里插入图片描述【思路分析】

  1. 通过head来连接,两部分,一部分自己内部子树的连接,一部分和head->next子树之间的连接,设置外部的循环leftnode,leftnode的left为NULL时,代表循环结束,内部建立从左到右的开始节点start=leftnode,循环至start=NULL
  2. 通过队列的方式来做,将每一行存入队列中,并且将每一行的节点按照个数循环,同时将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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值