Given a `n * n` matrix `grid` of `0's` and `1's` only. We want to represent `grid` with a Quad-Tree.

Return _the root of the Quad-Tree representing_ `grid`.

A Quad-Tree is a tree data structure in which each internal node has exactly four children. Besides, each node has two attributes:

*   `val`: True if the node represents a grid of 1's or False if the node represents a grid of 0's. Notice that you can assign the `val` to True or False when `isLeaf` is False, and both are accepted in the answer.
*   `isLeaf`: True if the node is a leaf node on the tree or False if the node has four children.

class Node {
    public boolean val;
    public boolean isLeaf;
    public Node topLeft;
    public Node topRight;
    public Node bottomLeft;
    public Node bottomRight;
}

We can construct a Quad-Tree from a two-dimensional area using the following steps:

1.  If the current grid has the same value (i.e all `1's` or all `0's`) set `isLeaf` True and set `val` to the value of the grid and set the four children to Null and stop.
2.  If the current grid has different values, set `isLeaf` to False and set `val` to any value and divide the current grid into four sub-grids as shown in the photo.
3.  Recurse for each of the children with the proper sub-grid.

If you want to know more about the Quad-Tree, you can refer to the [wiki](https://en.wikipedia.org/wiki/Quadtree).

**Quad-Tree format:**

You don't need to read this section for solving the problem. This is only if you want to understand the output format here. The output represents the serialized format of a Quad-Tree using level order traversal, where `null` signifies a path terminator where no node exists below.

It is very similar to the serialization of the binary tree. The only difference is that the node is represented as a list `[isLeaf, val]`.

If the value of `isLeaf` or `val` is True we represent it as **1** in the list `[isLeaf, val]` and if the value of `isLeaf` or `val` is False we represent it as **0**.

**Example 1:**

**Input:** grid = \[\[0,1\],\[1,0\]\]
**Output:** \[\[0,1\],\[1,0\],\[1,1\],\[1,1\],\[1,0\]\]
**Explanation:** The explanation of this example is shown below:
Notice that 0 represnts False and 1 represents True in the photo representing the Quad-Tree.
 

**Example 2:**

**Input:** grid = \[\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,1,1,1,1\],\[1,1,1,1,1,1,1,1\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\]\]
**Output:** \[\[0,1\],\[1,1\],\[0,1\],\[1,1\],\[1,0\],null,null,null,null,\[1,0\],\[1,0\],\[1,1\],\[1,1\]\]
**Explanation:** All values in the grid are not the same. We divide the grid into four sub-grids.
The topLeft, bottomLeft and bottomRight each has the same value.
The topRight have different values so we divide it into 4 sub-grids where each has the same value.
Explanation is shown in the photo below:
 

**Constraints:**

*   `n == grid.length == grid[i].length`
*   `n == 2x` where `0 <= x <= 6`
0'과 '1'로만 구성된 `n * n` 행렬 `그리드`가 주어집니다. 그리드`를 쿼드 트리로 표현하고 싶습니다.

그리드`를 나타내는 쿼드 트리의 루트를 반환합니다.

쿼드 트리는 각 내부 노드가 정확히 4개의 자식을 갖는 트리 데이터 구조입니다. 또한 각 노드에는 두 개의 속성이 있습니다:

* `val`: 노드가 1의 격자를 나타내는 경우 True, 0의 격자를 나타내는 경우 False입니다. isLeaf`가 False일 때 `val`을 True 또는 False로 할당할 수 있으며, 두 가지 모두 답에 허용된다는 점에 유의하세요.
* `isLeaf`: 노드가 트리의 리프 노드이면 True, 노드에 4개의 자식이 있으면 False입니다.

Node 클래스 {
    공용 부울 val;
    public boolean isLeaf;
    public Node topLeft;
    public Node topRight;
    public Node bottomLeft;
    public Node bottomRight;
}

다음 단계를 통해 2차원 영역에서 쿼드 트리를 만들 수 있습니다:

1.  현재 그리드의 값이 동일한 경우(즉, 모두 `1` 또는 모두 `0`) `isLeaf`를 True로 설정하고 `val`을 그리드의 값으로 설정하고 네 개의 자식을 Null로 설정하고 중지합니다.
2.  현재 그리드의 값이 다른 경우 `isLeaf`를 False로 설정하고 `val`을 임의의 값으로 설정한 다음 사진과 같이 현재 그리드를 4개의 하위 그리드로 나눕니다.
3.  적절한 하위 그리드를 가진 각 자식에 대해 재귀합니다.

쿼드 트리에 대한 자세한 내용은 [위키](https://en.wikipedia.org/wiki/Quadtree)를 참고하세요.

**쿼드 트리 형식:**

문제 해결을 위해 이 섹션을 읽을 필요는 없습니다. 여기서는 출력 형식을 이해하고자 하는 경우에만 읽어야 합니다. 출력은 레벨 순서 순회 탐색을 사용하는 쿼드 트리의 직렬화된 형식을 나타내며, 여기서 `null`은 아래에 노드가 없는 경로 종결자를 의미합니다.

이는 바이너리 트리의 직렬화와 매우 유사합니다. 유일한 차이점은 노드가 `[isLeaf, val]` 목록으로 표현된다는 점입니다.

isLeaf` 또는 `val`의 값이 True이면 `[isLeaf, val]` 리스트에서 **1**로 표현하고, `isLeaf` 또는 `val`의 값이 False이면 **0**으로 표현합니다.

**예제 1:**

**Input:** grid = \[\[0,1\],\[1,0\]\]
**Output:** \[\[0,1\],\[1,0\],\[1,1\],\[1,1\],\[1,0\]\]
**설명:** 이 예제에 대한 설명은 아래와 같습니다:
쿼드 트리를 나타내는 사진에서 0은 거짓을 나타내고 1은 참을 나타냅니다.
 

**예제 2:**

**Input:** grid = \[\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,1,1,1,1\],\[1,1,1,1,1,1,1,1\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\],\[1,1,1,1,0,0,0,0\]\]
**Output:** \[\[0,1\],\[1,1\],\[0,1\],\[1,1\],\[1,0\],null,null,null,null,\[1,0\],\[1,0\],\[1,1\],\[1,1\]\]
**설명:** 그리드의 모든 값은 동일하지 않습니다. 그리드를 4개의 하위 그리드로 나눕니다.
위쪽, 아래쪽, 아래쪽 오른쪽은 각각 같은 값을 갖습니다.
topRight는 값이 다르므로 각각 같은 값을 갖는 4개의 하위 그리드로 나눕니다.
아래 사진에 설명이 나와 있습니다:
 

**제약 조건:**

* `n == grid.length == grid[i].length`
* `n == 2x` 여기서 `0 <= x <= 6`