zoukankan      html  css  js  c++  java
  • 【LeetCode-二叉树】填充每个节点的下一个右侧节点指针

    题目描述

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

    struct Node {
      int val;
      Node *left;
      Node *right;
      Node *next;
    }
    

    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

    初始状态下,所有 next 指针都被设置为 NULL。

    示例:

    题目链接: https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/

    思路1

    这题使用 bfs 会比较好写一点。先获得每一层的节点,然后对于每一层的节点,将当前节点的 next 指向下一个节点,如果当前节点是最后一个节点,则 next 指向 nullptr。代码如下:

    /*
    // 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==nullptr) return nullptr;
    
            queue<Node*> q;
            q.push(root);
            while(!q.empty()){
                int n = q.size();
                for(int i=0; i<n; i++){
                    Node* node = q.front(); q.pop();
                    if(i+1<n) node->next = q.front();
                    else node->next = nullptr;
                    if(node->left!=nullptr) q.push(node->left);
                    if(node->right!=nullptr) q.push(node->right);
                }
            }
            return root;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(n)

    思路2

    使用递归来做。代码如下:

    /*
    // 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==nullptr) return root;
    
            connect(root->left, root->right);
            return root;
        }
    
        void connect(Node* left, Node* right){
            if(left!=nullptr){
                left->next = right;
                connect(left->left, left->right);
                if(right!=nullptr){
                    connect(left->right, right->left);
                    connect(right->left, right->right);
                }
            }
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(h)
  • 相关阅读:
    mysql concat
    (三)微信小程序之发送服务通知(模板消息)
    小型web服务器thttpd的学习总结(下)
    小型web服务器thttpd的学习总结(上)
    平方根倒数快速算法
    微信公众平台服务框架
    静态库动态库回顾
    RocketMQ常用命令
    rocketmq配置文件参数(broker-xx.properties)
    RocketmMQ的组成及相关概念
  • 原文地址:https://www.cnblogs.com/flix/p/13285716.html
Copyright © 2011-2022 走看看