C语言每日一题解:填充每个节点的下一个右侧节点的指针

一、题目描述如下

leetcode原题链接: 力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/populating-next-right-pointers-in-each-node/

二、思路分析 

  由题意可知,本题给出的条件是一个完美的二叉树。所以在考虑具体操作和边界问题的时候,可以不需要判断左右儿子是否存在的问题。

  对于题目本身来说,在根节点不为空的情况下,存在三种情况(以示例1二叉树的前三层为例):

  • 最右侧这一列的节点全部指向空(root->next=NULL)。
  • 在相同的子树中,左儿子指向右儿子(root->left->next=root->right)。
  • 在不同的子树中,节点的右儿子指向同层相邻节点的左儿子。

示意图如下所示:

 

  通过以上分析我们可以发现,二叉树的每一层都是从最左侧节点开始的。所以,我们可以用迭代法对二叉树的最左侧节点进行遍历。

算法步骤:

  1.  判断根节点是否为空,如是返回NULL;
  2. 定义一个新的指针指向根节点,保持原函数的输入根节点的指针不变,有利于最后的输出;
  3. 定义一个while嵌套循环,判断以上的三种情况,并做出出相应的操作;
  4. 遍历完成,返回根节点。

三、代码实现 

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *left;
 *     struct Node *right;
 *     struct Node *next;
 * };
 */

struct Node* connect(struct Node* root) {
    if(root==NULL)
    {
        return NULL;
    }
    struct Node *leftmost=root;
    while(leftmost->left!=NULL)  //对二叉树的最左侧节点进行遍历操作
	{
        struct Node* head=leftmost;  //临时变量储存leftmost,便于后续操作
        while(head!=NULL)       //对该层的节点进行遍历操作
        {
            head->left->next=head->right;    //在相同子树之间的情况
            if(head->next!=NULL)
            {
                head->right->next=head->next->left;    //在不同子树之间的情况
            }
            head=head->next;                  
        }
        leftmost=leftmost->left;
    }

    return root;
}

 

 

  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值