116. 각 노드에 다음 오른쪽 포인터 채우기

설명



모든 잎이 같은 수준에 있고 모든 부모가 두 자녀를 갖는 완벽한 이진 트리가 제공됩니다. 이진 트리의 정의는 다음과 같습니다.

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


다음 오른쪽 노드를 가리키도록 각 다음 포인터를 채웁니다. 다음 오른쪽 노드가 없으면 다음 포인터를 NULL로 설정해야 합니다.

처음에는 모든 다음 포인터가 NULL로 설정됩니다.

예 1:




Input: root = [1,2,3,4,5,6,7]
Output: [1,#,2,3,#,4,5,6,7,#]
Explanation: Given the above perfect binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B. The serialized output is in level order as connected by the next pointers, with '#' signifying the end of each level.


예 2:




Input: root = []
Output: []


제약:


  • 트리의 노드 수가 [0, 212 - 1] 범위에 있습니다.
  • 1000 <= Node.val <= 1000

  • 후속 조치:


  • 일정한 추가 공간만 사용할 수 있습니다.
  • 재귀 접근 방식이 좋습니다. 암시적 스택 공간이 이 문제에 대한 추가 공간으로 간주되지 않는다고 가정할 수 있습니다.



  • 솔루션



    솔루션 1



    직관



    암호




    /*
    // 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) return root;
            auto node = root;
            while (node->left) {
                for (auto p = node; p; p = p->next) {
                    p->left->next = p->right;
                    if (p->next) p->right->next = p->next->left;
                }
                node = node->left;
            }
            return root;
        }
    }
    


    복잡성


  • 시간: O(n)
  • 공간: O(1)



  • 솔루션 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) return root;
    
            queue<Node*> que;
            que.push(root);
            while (!que.empty()) {
                int n = que.size();
                Node* node;
                for (int i = 0; i < n; i++) {
                    node = que.front();
                    que.pop();
    
                    if (i != n - 1)
                        node->next = que.front();
                    else
                        node->next = NULL;
                    if (node->left) que.push(node->left);
    
                    if (node->right) que.push(node->right);
                }
            }
            return root;
        }
    };
    


    복잡성


  • 시간: O(n)
  • 스페이스: O(n)



  • 유제

    좋은 웹페이지 즐겨찾기