【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)
posted @ 2020-07-11 21:57  Flix  阅读(212)  评论(0编辑  收藏  举报