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

手写笔记

这道题比较简单
在这里插入图片描述

代码

我自己的代码,最初没想明白怎么链接不同节点的子节点,比如:节点5和节点6如何链接,所以用了个复制queue的操作,增加了时间复杂度。看了官方题解发现小丑竟是我自己,根本就不用纠结这个,因为每一次pop都可以链接得上,而且最后一个节点时初始化就是NULL。

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        if(root){
            queue<Node*> q;
            q.push(root);
            Node* curr;
            int len = 2;
            while(!q.empty()){
                Node* temp = q.front();
                if(temp){
                    // cout << temp->val << ' ';
                    q.push(temp->left);
                    q.push(temp->right);
                }
                q.pop();
                if(q.size() == len){
                    queue<Node*> temp(q);
                    curr = temp.front();
                    temp.pop();
                    while(!temp.empty()){
                        if(temp.front()){
                            curr->next = temp.front();
                            curr = curr->next;
                        
                        }
                        temp.pop();
                    }
                    len*=2;
                }
            }
        }
        return root;
    }
};

官方题解

class Solution {
public:
    Node* connect(Node* root) {
        if (root == nullptr) {
            return root;
        }
        
        // 初始化队列同时将第一层节点加入队列中,即根节点
        queue<Node*> Q;
        Q.push(root);
        
        // 外层的 while 循环迭代的是层数
        while (!Q.empty()) {
            
            // 记录当前队列大小
            int size = Q.size();
            
            // 遍历这一层的所有节点
            for(int i = 0; i < size; i++) {
                
                // 从队首取出元素
                Node* node = Q.front();
                Q.pop();
                
                // 连接
                if (i < size - 1) {
                    node->next = Q.front();
                }
                
                // 拓展下一层节点
                if (node->left != nullptr) {
                    Q.push(node->left);
                }
                if (node->right != nullptr) {
                    Q.push(node->right);
                }
            }
        }
        
        // 返回根节点
        return root;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/solution/tian-chong-mei-ge-jie-dian-de-xia-yi-ge-you-ce-2-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值