# 0427. Construct Quad Tree
###### tags: `Leetcode` `Recursion` `Medium`
Link: https://leetcode.com/problems/construct-quad-tree/description/
## Code
```java=
class Solution {
public Node construct(int[][] grid) {
int m = grid.length, n = grid[0].length;
return dfs(grid, 0, m-1, 0, n-1);
}
private Node dfs(int[][] grid, int startx, int endx, int starty, int endy){
if(startx==endx && starty==endy) return new Node(grid[startx][starty]==1, true);
Node root = new Node();
int midx = (startx+endx)/2, midy = (starty+endy)/2;
Node topLeft = dfs(grid, startx, midx, starty, midy);
Node topRight = dfs(grid, startx, midx, midy+1, endy);
Node bottomLeft = dfs(grid, midx+1, endx, starty, midy);
Node bottomRight = dfs(grid, midx+1, endx, midy+1, endy);
if(topLeft.isLeaf && topRight.isLeaf && bottomLeft.isLeaf && bottomRight.isLeaf && topLeft.val==topRight.val && topRight.val==bottomLeft.val && bottomLeft.val==bottomRight.val){
root.val = topLeft.val;
root.isLeaf = true;
}
else{
root.topLeft = topLeft;
root.topRight = topRight;
root.bottomLeft = bottomLeft;
root.bottomRight = bottomRight;
}
return root;
}
}
```