【LeetCode 面试经典150题】Populating Next Right Pointers in Each Node II 填充每个节点的右侧节点的指针II

117. Populating Next Right Pointers in Each Node II

题目大意

Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

中文释义

填充每个节点的 next 指针,使其指向其右侧的下一个节点。如果没有右侧的下一个节点,则将 next 指针设置为 NULL。

初始时,所有 next 指针都设置为 NULL。

示例

示例 1:

在这里插入图片描述

输入: root = [1,2,3,4,5,null,7]
输出: [1,#,2,3,#,4,5,7,#]

示例 2:

输入: root = []
输出: []

限制条件

  • The number of nodes in the tree is in the range [0, 6000].
  • -100 <= Node.val <= 100

解题思路

方法

该方法使用层次遍历(广度优先搜索)来连接每个节点的 next 指针。

  1. 检查空树

    • 如果根节点为空,直接返回 nullptr
  2. 使用队列进行层次遍历

    • 使用一个队列 node_queue 存储每层的节点。
  3. 遍历每一层

    • 对于每一层的节点,依次从队列中取出并连接 next 指针。
    • 如果节点是这一层的最后一个节点,将其 next 指向 nullptr;否则,将其 next 指向队列的下一个节点。
  4. 添加子节点到队列

    • 将当前节点的左右子节点添加到队列中,以便下一轮遍历。
  5. 更新队列大小

    • 更新队列的大小,准备遍历下一层的节点。
  6. 返回根节点

    • 在遍历完所有层次后,返回根节点。

代码

class Solution {
public:
    Node* connect(Node* root) {
        if (root == nullptr) return root;
        queue<Node*> node_queue;
        node_queue.push(root);
        int count = 1;

        while (!node_queue.empty()) {
            int temp_count = 0;
            for (int i = 0; i < count; i++) {
                Node* node = node_queue.front();
                node_queue.pop();
                if (i == count - 1) {
                    node -> next = nullptr;
                } else {
                    node -> next = node_queue.front();
                }
                
                if (node -> left) {
                    node_queue.push(node -> left);
                    temp_count++;
                }
                if (node -> right) {
                    node_queue.push(node -> right);
                    temp_count++;
                }
            }
            count = temp_count;
        }
        return root;
    }
};
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值