当前位置: 首页 > ds >正文

427. 建立四叉树

https://leetcode.cn/problems/construct-quad-tree/description/?envType=study-plan-v2&envId=top-interview-150

思路:这题乍一看很复杂但是只要读懂题找到规律就会发现其实很简单
四叉树的构造规律:
1. 如果一个区域的值全相等,那么这个区域就是叶子节点,val = grid[x][y]==1, isLeaf = true。
2. 如果一个区域的值不全相等,那么这个区域就不是叶子节点,val = 随意(true、false都行), isLeaf = false。
3. 如果一个区域的值不全相等,那么这个新生成的节点不是叶节点所以有四个子节点,每个子节点对应一个子区域;反之叶节点不应该有子节点。

所以我们就可以对grid分治了,每次将它分成四个区域,如果某一区域不能再分了,我们就返回该区域对应节点(一定是leaf),递归结束后我们再按规律合并这四个区域。

class Solution {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;}}public Node construct(int[][] grid) {Node root = divide(grid, 0, 0, grid.length - 1, grid[0].length - 1);return root;}public Node divide(int[][] grid, int x1, int y1, int x2, int y2) {if( x1 == x2 && y1 == y2) {return new Node(grid[x1][y1] == 1, true);}// 把这个区域分成四部分int topLeft_x1 = x1, topLeft_y1 = y1, topLeft_x2 = (x1 + x2) / 2, topLeft_y2 = (y1 + y2) / 2;int topRight_x1 = x1, topRight_y1 = topLeft_y2 + 1, topRight_x2 = topLeft_x2, topRight_y2 = y2;int bottomLeft_x1 = topLeft_x2 + 1, bottomLeft_y1 = y1, bottomLeft_x2 = x2, bottomLeft_y2 = topLeft_y2;int bottomRight_x1 = bottomLeft_x1, bottomRight_y1 = topLeft_y2 + 1, bottomRight_x2 = x2, bottomRight_y2 = y2;Node topLeftNode = divide(grid, topLeft_x1, topLeft_y1, topLeft_x2, topLeft_y2);Node topRightNode = divide(grid, topRight_x1, topRight_y1, topRight_x2, topRight_y2);Node bottomLeftNode = divide(grid, bottomLeft_x1, bottomLeft_y1, bottomLeft_x2, bottomLeft_y2);Node bottomRightNode = divide(grid, bottomRight_x1, bottomRight_y1, bottomRight_x2, bottomRight_y2);return merge(topLeftNode, topRightNode, bottomLeftNode, bottomRightNode);}public Node merge(Node topLeft, Node topRight, Node bottomLeft, Node bottomRight) {// 如果所有子节点全是叶子节点并且它们的值全相等就说明新被构造出的节点也是叶子节点// 注意新构造出的叶子节点没有子节点if(topLeft.isLeaf && topRight.isLeaf && bottomLeft.isLeaf && bottomRight.isLeaf&& topLeft.val == topRight.val && topRight.val == bottomLeft.val && bottomLeft.val == bottomRight.val) {return new Node(topLeft.val, true, null, null, null, null);} else { // 否则新构造出的节点不是叶子节点,该节点的值随意return new Node(topLeft.val, false, topLeft, topRight, bottomLeft, bottomRight);}}public static void main(String[] args) {Solution solution = new Solution();int[][] 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}};solution.construct(grid);}
}

http://www.xdnf.cn/news/8798.html

相关文章:

  • OpenLayers 加载动画控件
  • 对比Redis与向量数据库(如Milvus)在AI中的应用
  • PyQt5高效布局指南:QTabWidget与QStackedWidget实战解析
  • LangChain4j第三篇: RAG的简单应用与实践
  • 留存率问题
  • [AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)
  • QWidget类关系图
  • AI方案调研与实践二:模型训练
  • 电子电路:什么是孤立导体?即孤立导体的电荷分布与特性
  • Linux常见指令合集+知识点
  • 12软件测试需求分析案例-删除学生信息
  • 量子计算:开启未来计算新纪元的革命性技术
  • CAU人工智能class5 激活函数
  • 科学计算中的深度学习模型精解(2)(RNN,LSTM,Transformer,KAN)
  • 自动涂胶机设计及其在工业生产中的应用研究
  • 软件测试:黑盒+白盒测试【等价类/边界值/判定表/因果图/两两组合/场景/错误推测逻辑覆盖/路径分析】
  • 光模块(Optical Module)的工作原理、技术参数、应用场景及行业趋势
  • (头歌作业)-Python第六章作业
  • 给定终点和时间的DoubleS轨迹
  • 语音搜索崛起:专业优化指南助您引领潮流
  • Docker 安装 Harbor 教程(搭建 Docker 私有仓库 harbor 避坑指南)【woodwhales.cn】
  • C++入门
  • mysql统计数据库大小
  • 【场景分析】基于概率距离快速削减法的风光场景生成与削减方法
  • MSP430G2553 USCI模块串口通信
  • tvalid寄存器的理解
  • 第一课如何学习课程
  • WebXR 虚拟现实开发
  • John the Ripper 入门指南:密码破解工具的正确打开方式
  • 【C++】C++异步编程四剑客:future、async、promise和packaged_task详解