解题思路
实际上就是递归构建树,但是理解题意会比较困难,可以看一下题解,就会明白四叉树的定义
当前区域内值均相同,那么就是一个非叶子节点,反之则需要再次进行划分,从正方形的中心点开始分割
代码
/*
// Definition for a QuadTree node.
class Node {
public boolean val;
public boolean isLeaf;
public Node topLeft;
public Node topRight;
public Node bottomLeft;
public Node bottomRight;
public Node() {
this.val = false;
this.isLeaf = false;
this.topLeft = null;
this.topRight = null;
this.bottomLeft = null;
this.bottomRight = null;
}
public Node(boolean val, boolean isLeaf) {
this.val = val;
this.isLeaf = isLeaf;
this.topLeft = null;
this.topRight = null;
this.bottomLeft = null;
this.bottomRight = null;
}
public Node(boolean val, boolean isLeaf, Node topLeft, Node topRight, Node bottomLeft, Node bottomRight) {
this.val = val;
this.isLeaf = isLeaf;
this.topLeft = topLeft;
this.topRight = topRight;
this.bottomLeft = bottomLeft;
this.bottomRight = bottomRight;
}
};
*/
class Solution {
public Node construct(int[][] grid) {
return dfs(grid,0,grid.length,0,grid[0].length);
}
public Node dfs(int[][] grid,int row0,int row1,int col0,int col1){
boolean same = true;
for (int i = row0; i < row1; i++) {
for (int j = col0; j < col1; j++) {
if (grid[i][j] != grid[row0][col0]){
same = false;
break;
}
}
if (!same){
break;
}
}
//区域内值全部相同是叶子节点
if (same){
return new Node(grid[row0][col0] == 1,same);
}
//非叶子节点,从中间开始进行分割
Node res = new Node(true,false,
dfs(grid,row0,(row0+row1)/2,col0,(col0+col1)/2),
dfs(grid,row0,(row0+row1)/2,(col0+col1)/2,col1),
dfs(grid,(row0+row1)/2,row1,col0,(col0+col1)/2),
dfs(grid,(row0+row1)/2,row1,(col0+col1)/2,col1));
return res;
}
}