题目描述:

给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。

你需要返回能表示矩阵的 四叉树 的根结点。

注意,当 isLeaf 为 False 时,你可以把 True 或者 False 赋值给节点,两种值都会被判题机制 接受

四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:

  • val:储存叶子结点所代表的区域的值。1 对应 True,0 对应 False;
  • isLeaf: 当这个节点是一个叶子结点时为 True,如果它有 4 个子节点则为 False 。
class Node {public boolean val;public boolean isLeaf;public Node topLeft;public Node topRight;public Node bottomLeft;public Node bottomRight;
}

我们可以按以下步骤为二维区域构建四叉树:

  1. 如果当前网格的值相同(即,全为 0 或者全为 1),将 isLeaf 设为 True ,将 val 设为网格相应的值,并将四个子节点都设为 Null 然后停止。
  2. 如果当前网格的值不同,将 isLeaf 设为 False, 将 val 设为任意值,然后如下图所示,将当前网格划分为四个子网格。
  3. 使用适当的子网格递归每个子节点。
    如果你想了解更多关于四叉树的内容,可以参考 wiki 。

四叉树格式:

输出为使用层序遍历后四叉树的序列化形式,其中 null 表示路径终止符,其下面不存在节点。

它与二叉树的序列化非常相似。唯一的区别是节点以列表形式表示 [isLeaf, val] 。

如果 isLeaf 或者 val 的值为 True ,则表示它在列表 [isLeaf, val] 中的值为 1 ;如果 isLeaf 或者 val 的值为 False ,则表示值为 0 。

示例 1:
示例 2:
输入: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]]
输出:[[0,1],[1,1],[0,1],[1,1],[1,0],null,null,null,null,[1,0],[1,0],[1,1],[1,1]]
解释:网格中的所有值都不相同。我们将网格划分为四个子网格。
topLeft,bottomLeft 和 bottomRight 均具有相同的值。
topRight 具有不同的值,因此我们将其再分为 4 个子网格,这样每个子网格都具有相同的值。
解释如下图所示:
示例 3:
输入:grid = [[1,1],[1,1]]
输出:[[1,1]]

示例 4:
输入:grid = [[0]]
输出:[[1,0]]

示例 5:
输入:grid = [[1,1,0,0],[1,1,0,0],[0,0,1,1],[0,0,1,1]]
输出:[[0,1],[1,1],[1,0],[1,0],[1,1]]

提示:
n == grid.length == grid[i].length
n == 2^x 其中 0 <= x <= 6

解题思路一:递归

class Solution {public:Node *construct(vector<vector<int>> &grid) {function<Node*(int, int, int, int)> dfs = [&](int r0, int c0, int r1, int c1) {for (int i = r0; i < r1; ++i) {for (int j = c0; j < c1; ++j) {if (grid[i][j] != grid[r0][c0]) { // 不是叶节点return new Node(true,false,dfs(r0, c0, (r0 + r1) / 2, (c0 + c1) / 2),//topLeftdfs(r0, (c0 + c1) / 2, (r0 + r1) / 2, c1),//topRightdfs((r0 + r1) / 2, c0, r1, (c0 + c1) / 2),//bottomLeftdfs((r0 + r1) / 2, (c0 + c1) / 2, r1, c1)//bottomRight);}}}// 是叶节点return new Node(grid[r0][c0], true);};return dfs(0, 0, grid.size(), grid.size());}
};

解题思路二:递归 + 二维前缀和优化。O(1) 的时间内得到grid部分的和,空间换时间。

class Solution {public:Node *construct(vector<vector<int>> &grid) {int n = grid.size();vector<vector<int>> pre(n + 1, vector<int>(n + 1));for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + grid[i - 1][j - 1];}}auto getSum = [&](int r0, int c0, int r1, int c1) {return pre[r1][c1] - pre[r1][c0] - pre[r0][c1] + pre[r0][c0];};function<Node *(int, int, int, int)> dfs = [&](int r0, int c0, int r1, int c1) {int total = getSum(r0, c0, r1, c1);if (total == 0) {return new Node(false, true);}if (total == (r1 - r0) * (c1 - c0)) {return new Node(true, true);}return new Node(true,false,dfs(r0, c0, (r0 + r1) / 2, (c0 + c1) / 2),dfs(r0, (c0 + c1) / 2, (r0 + r1) / 2, c1),dfs((r0 + r1) / 2, c0, r1, (c0 + c1) / 2),dfs((r0 + r1) / 2, (c0 + c1) / 2, r1, c1));};return dfs(0, 0, n, n);}
};

LeetCode-427. 建立四叉树【树,数组,分治,矩阵】相关推荐

  1. LeetCode 427. 建立四叉树

    427. 建立四叉树 题目来源:427. 建立四叉树 2022.04.29 每日一题 LeetCode 题解持续更新中GitHub仓库地址 CSDN博客地址 今天的题目一看,有点吓人,上来就给弄了个四 ...

  2. Java实现 LeetCode 427 建立四叉树

    427. 建立四叉树 我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络.网络中每一格的值只会是真或假.树的根结点代表整个网络.对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相 ...

  3. LeetCode——427. 建立四叉树

    427. 建立四叉树 题目描述 答案 方法一:递归 思路与算法 代码 方法二:递归 + 二维前缀和优化 思路与算法 代码 复杂度分析 题目描述 给你一个 n * n 矩阵 grid ,矩阵由若干 0 ...

  4. LeetCode 427. 建立四叉树 (递归dfs \ 矩阵)

    思路 根据0,1矩阵,构建四叉树,根据题意就是要判断,当前矩阵中的值是否全部相同 若矩阵内值相同,也就是只有0或1,则作为叶子节点,叶子结点的值就是这个矩阵的值 若矩阵内值不相同,也就是有0也有1,则 ...

  5. LeetCode 427. 建立四叉树(递归)

    1. 题目 我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络.网络中每一格的值只会是真或假.树的根结点代表整个网络.对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相同的. 每 ...

  6. LeetCode——427.建立四叉树

    通过万岁!!! 题目:就是给你一个n*n的数组,然后我们构建一个四叉树.就是把数组进行4等分,然后四个部分是四叉树的四个分支.只不过在这个过程中有一些规则. 如果这个数组(确切的说是子数组),里面的元 ...

  7. LeetCode题解:427. 建立四叉树

    文章目录 题目 427. 建立四叉树 1.题目描述 2.原题链接 解题报告 1.解题思路 2.解题方法 3.时间复杂度分析 4.代码详解 总结 前缀和实现 题目 427. 建立四叉树 1.题目描述   ...

  8. LeetCode 练习——427.建立四叉树

    文章目录 1.题目描述 2.思路 2.1 代码 2.2 测试结果 3.总结 1.题目描述 建立四叉树 给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成.请你用四叉树表示该矩阵 gr ...

  9. 力扣(LeetCode)427. 建立四叉树(2023.03.01)

    给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成.请你用四叉树表示该矩阵 grid . 你需要返回能表示矩阵的 四叉树 的根结点. 注意,当 isLeaf 为 False 时,你可 ...

  10. LeetCode每日一题——427. 建立四叉树

    文章目录 题目 示例 思路 题解 题目 给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成.请你用四叉树表示该矩阵 grid . 你需要返回能表示矩阵的 四叉树 的根结点. 注意,当 ...

最新文章

  1. 数学建模第四节2020.4.24-5.3补
  2. 概率dp——处理分母为0的情况hdu3853
  3. RabbitMQ发布确认原理
  4. 24点游戏c语言源代码6,C语言解24点游戏程序
  5. 背英语单词很困难,不妨学习一下词根词缀吧(每天10个词根、词缀)Part 2
  6. 4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析
  7. qt动态添加窗口到垂直布局
  8. IIS不能下载ini文件
  9. NPOI 操作EXCEL 小计
  10. java was datasource_mybatis默认的数据源连接池(PooledDataSource和UnPooledDataSource)
  11. android5.0+art模式,Android 5.0有哪些变化
  12. 地面控制点的定义与作用_彩色透水混凝土路面在海绵城市建设中能起多大作用?...
  13. ENVI的下载和安装
  14. [心得]分布式系统概念与设计知识整理
  15. 如何删除Eclipse中的中文包,让中文Eclipse显示英文
  16. linux 安装触摸版驱动程序,在ubuntu和linux上配置触摸屏驱动程序启用触摸屏
  17. 800*480bmp图片显示
  18. python3 数据挖掘 之 爬取 智联招聘网站来巩固pandas
  19. 分布式 | dble 读写分离场景下为什么普通的读 sql 发送到了 master 实例上
  20. 热备份冗余技术HSRP

热门文章

  1. android实现个税计算器,个税计算器2021 - 个人所得税计算器2021 -
  2. NC63发送消息实例
  3. wxPython教程(一)
  4. Linux C/C++ or 嵌入式面试之《网络编程系列》(7) time_wait状态的若干问题
  5. 2019南京icpc网选D-robot
  6. Label Smoothing标签平滑详解+Pytorch保姆级实际操作
  7. 基于Javaweb的教学评价系统|评分系统
  8. 又出现一个汉语新词:目田
  9. Analysis of theBlockchain Protocol in Asynchronous Networks
  10. Postgresql - 错误解决 - 9.3 - database is not accepting commands to avoid wraparound data......