文章目录

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

题目 427. 建立四叉树

1、题目描述

  给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。
你需要返回能表示矩阵的 四叉树 的根结点。
  注意,当 isLeaf 为 False 时,你可以把 True 或者 False 赋值给节点,两种值都会被判题机制 接受 。
  四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:
    val:储存叶子结点所代表的区域的值。1 对应 True,0 对应 False;
    isLeaf: 当这个节点是一个叶子结点时为 True,如果它有 4 个子节点则为 False 。

  • 我们可以按以下步骤为二维区域构建四叉树:
      如果当前网格的值相同(即,全为 0 或者全为 1),将 isLeaf 设为 True ,将 val 设为网格相应的值,并将四个子节点都设为 Null 然后停止。
      如果当前网格的值不同,将 isLeaf 设为 False, 将 val 设为任意值,然后如下图所示,将当前网格划分为四个子网格。
      使用适当的子网格递归每个子节点。

2、原题链接

427. 建立四叉树

解题报告

1、解题思路


   ( 1 ) (1) (1) 如果这个区域内所有元素都相等那么看做一个节点。将 val设置为整体的值 isLeaftrue
   ( 2 ) (2) (2)若不相等,则整个块分四块每块大小 n / 2。如果分的每块不是单个元素那么继续分块。每块就是一个节点(DFS)
   ( 3 ) (3) (3) 由于是先判断是否相等,所以这四个节点肯定是不相等的。isLeaf
false
   ( 4 ) (4) (4) 返回整个四叉树的根节点即可。

2、解题方法

  DFS;

3、时间复杂度分析

  由于判断元素相等是一个O(n^2)的算法。时间复杂度应该是O(n^2logm)m为整个矩阵的行数(应该吧,我猜的)

4、代码详解

bool isAllSame(vector<vector<int>>& grid, int x, int y, int length){     //(1)int n = x + length;int m = y + length;int val = grid[x][y];for(int i = x; i < n; ++i){for(int j = y; j < m; ++j){if(val != grid[i][j]){return false;}}}return true;
}Node* dfs(vector<vector<int>>& grid, int x, int y, int length){if (isAllSame(grid, x, y, length)){                                     //(2)Node * node = new Node(grid[x][y], true);return node;}Node * node = new Node();int newn = length >> 1;                                                    //(3)node->topLeft = dfs(grid, x, y, newn);node->bottomLeft = dfs(grid, x + newn, y, newn);node->topRight = dfs(grid, x, y + newn, newn);node->bottomRight = dfs(grid, x + newn, y + newn, newn);node->val = true;node->isLeaf = false;return node;
}
Node* construct(vector<vector<int>>& grid) {int n = grid.size();return dfs(grid, 0, 0, n);
}
  • (1) 判断范围内元素是否全部相同。
  • (2) 如果相同不需要递归向下,直接作为一个节点返回。不会有内存泄露。
  • (3) 分块后递归解决每一块。

总结

  • 构建树的问题首先考虑的就是深度优先搜索。
  • 由于求和时间复杂度比较大。是不是可以用二维数组前缀和来解决问题。
    • 因为数组的值只有0,1。当全1的时候 ,区域和一定定语区域元素个数,全0的时候区域和为0。这样只需要遍历一次数组就可以判断是否满足条件了。

前缀和实现

void getsum(vector<vector<int>>& mat, vector<vector<int>>& sum){int n = mat.size();int i, j;for(i = 0; i < n; ++i) {for(j = 0; j < n; ++j) {if(i == 0) {if(j == 0) {sum[i][j] = mat[i][j];}else {sum[i][j] = mat[i][j] + sum[i][j-1];}}else {if(j == 0) {sum[i][j] = mat[i][j] + sum[i-1][j];}else {sum[i][j] = mat[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];}}}}
}
int getSum(vector<vector<int>>& sum, int r, int c) {if(r == -1 || c == -1) {return 0;}return sum[r][c];
}int getSum2(vector<vector<int>>& sum, int r1, int c1, int r2, int c2) {return getSum(sum, r2, c2) - getSum(sum, r1-1, c2) - getSum(sum, r2, c1-1) + getSum(sum, r1-1, c1-1);
}bool isAllSame(vector<vector<int>>& grid, int x, int y, int length, vector<vector<int>>& sum){int n = x + length - 1;
int m = y + length - 1;
int val = getSum2(sum, x, y, n, m);
if(val == length * length || val == 0)return true;
return false;
}Node* dfs(vector<vector<int>>& grid, int x, int y, int length, vector<vector<int>>& sum){if (isAllSame(grid, x, y, length, sum)){Node * node = new Node(grid[x][y], true);return node;}Node * node = new Node();int newn = length >> 1;   node->topLeft = dfs(grid, x, y, newn, sum);node->bottomLeft = dfs(grid, x + newn, y, newn, sum);node->topRight = dfs(grid, x, y + newn, newn, sum);node->bottomRight = dfs(grid, x + newn, y + newn, newn, sum);node->val = true;node->isLeaf = false;return node;
}
Node* construct(vector<vector<int>>& grid) {int n = grid.size();int i;vector<vector<int>> sum;vector<int> add;for(i = 0; i < n+1; ++i){add.push_back(0);}for(i = 0; i < n+1; ++i){sum.push_back(add);}getsum(grid, sum);return dfs(grid, 0, 0, n, sum);
}

LeetCode题解:427. 建立四叉树相关推荐

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

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

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

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

  3. leetcode:427. 建立四叉树【经典建树】

    分析 这道题很经典 经典buildTree 从最大的框开始 如果这个大框元素全部相同则其val就是里面的元素值,并且它是叶子,没有孩子节点 否则 则继续划分四个小框 作为叶子放在大框下面继续判断即可 ...

  4. LeetCode 427. 建立四叉树

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

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

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

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

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

  7. LeetCode刷题——建立四叉树#427#Medium

    建立四叉树的思路探讨与源码     建立四叉树的题目如下图,该题属于树类和数组类型的题目,主要考察对于搜索方法的使用和树结构的理解.本文的题目作者想到2种方法,分别是递归方法和二维前缀和方法,其中递归 ...

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

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

  9. leetcode 427. Construct Quad Tree | 427. 建立四叉树(分治法)

    题目 https://leetcode.com/problems/construct-quad-tree/ 题解 /* // Definition for a QuadTree node. class ...

最新文章

  1. EditText中的几个常用属性
  2. linux 别名管理,Linux 的 15 个命令行别名, 帮系统管理员提升工作效率!
  3. linux脚本外输入参数,shell 脚本中关于用户输入参数的处理
  4. 应用案例 | Blink 有何特别之处?菜鸟供应链场景最佳实践
  5. spring面试重点
  6. RibbitMQ 大数据分布式下的消息队列思
  7. 蓝桥杯-用宏求球的体积(java)
  8. 吴恩达 coursera ML 第二课总结+作业答案
  9. c语言ungetc参数,关于一些C语言标准I/O函数的见解。int ungetc(int ch,FILE *fp)函数...
  10. 配置MySQL8.0
  11. 洛谷 P1080 国王游戏
  12. mpvue解析富文本mpvue-wxParse
  13. Python BFS 提取二值图联通域
  14. HttpClient、HttpURLConnection、OKHttp和Volley
  15. 2022前端HTML5面试题
  16. 2019年江苏卷数学高考真题Word版含答案解析
  17. excel sumifs多条件求和
  18. DSP 脉冲检测CAP
  19. [资源]C++ 程序员必收藏
  20. 4款国产实用软件,只因功能强大,常被误认为是外国人开发的

热门文章

  1. AcWing 1959. 奶牛芭蕾(模拟,坐标变换)
  2. @Mapper(componentModel = “spring“)注解
  3. 对象模型,动态模型,功能模型
  4. 每周一磁 · 铝镍钴永磁材料 AlNiCo
  5. 目标检测算法发展历程
  6. win7系统下搭建服务器搭建,win7系统下搭建iis服务器的方法步骤
  7. java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~【多用户关注共同的参数的统计功能】开发总结、再来个独立访客(Unique Visitor,简称UV)统计番外篇~整起
  8. 数学建模方法(1)引言
  9. 上拉电阻(Pull-upResistors)
  10. 别动 我把知识装你脑子里 冷宫霸主JVM