[LeetCode] Construct Quad Tree 建立四叉树
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or false. The root node represents the whole grid. For each node, it will be subdivided into four children nodes until the values in the region it represents are all the same.
Each node has another two boolean attributes : isLeaf and val. isLeaf is true if and only if the node is a leaf node. The val attribute for a leaf node contains the value of the region it represents.
Your task is to use a quad tree to represent a given grid. The following example may help you understand the problem better:
Given the 8 x 8 grid below, we want to construct the corresponding quad tree:

It can be divided according to the definition above:

The corresponding quad tree should be as following, where each node is represented as a (isLeaf, val)pair.
For the non-leaf nodes, val can be arbitrary, so it is represented as *.

Note:
Nis less than1000and guaranteened to be a power of 2.- If you want to know more about the quad tree, you can refer to its wiki.
这道题让我们根据一个二维数组来建立一棵四叉树,关于四叉树的介绍题目中也了给了wiki百科的链接。但是博主开始看到题目中给的那个例子,没怎么看懂。后来分析大神们的代码,才略微弄明白了一些。原来叶结点表示的是值相同的一片区域,比如我们看二维数组图示那行的第三个图,首先整个数组被分成了四等份,左上,左下,和右下部分内的值均相同,那么他们都是一个叶结点,而右上只有再四等分一下,才能使各自部分内的值相同,所以其就不是叶结点,而四等分后的每个区间才是叶结点。题目中限定了N的值一定是2的指数,就是说其如果可分的话,一定可以四等分,而之前说了,只有区间内的值不同时,才需要四等分,否则整体就当作一个叶结点。所以我们需要check四等分区间内的值是否相同,当然,我们可以将二维数组拆分为四个二维数组,但是那样可能不太高效,而且还占用额外空间,一个比较好的选择是用坐标变量来控制等分数组的范围,我们只需要一个起始点坐标,和区间的长度,就可以精确定位一个区间了。比如说对于例子中的整个二维数组数组来说,知道起始点坐标 (0, 0),还有长度8,就知道表示的是哪个区间。我们可以遍历这个区间上的其他所有的点,跟起点对比,只要有任何点跟起点不相同,则说明该区间是可分的,因为我们前面说了,只有一个区间上所有的值均相同,才能当作一个叶结点。只要有不同,就表示可以四分,那么我们就新建一个结点,这里的左上,左下,右上,和右下四个子结点就需要用过调用递归函数来实现了,实现原理都一样,重要的地方就是确定每个四分区间的起点和长度,长度好确定,都是当前长度的一半,然后就是把各个区间的起点确定好,这个也不难,就是细心一点,不要写错了就可以了,另外,对于非叶结点,结点值可以是true或者false都没问题。如果某个区间上所有值均相同,那么就生成一个叶结点,结点值就跟区间值相同,isLeaf是true,四个子结点均为NULL即可,参见代码如下:
解法一:
class Solution {
public:
Node* construct(vector<vector<int>>& grid) {
return build(grid, , , grid.size());
}
Node* build(vector<vector<int>>& grid, int x, int y, int len) {
if (len <= ) return NULL;
for (int i = x; i < x + len; ++i) {
for (int j = y; j < y + len; ++j) {
if (grid[i][j] != grid[x][y]) {
return new Node(true, false,
build(grid, x, y, len / ),
build(grid, x, y + len / , len / ),
build(grid, x + len/ , y, len / ),
build(grid, x + len / , y + len / , len / ));
}
}
}
return new Node(grid[x][y] == , true, NULL, NULL, NULL, NULL);
}
};
还有一种写法,记录了区间的左上点和右下点,知道这两个点也可以确定一个区间的位置,整体思路和上面的方法并没有什么太大的区别,参见代码如下:
解法二:
class Solution {
public:
Node* construct(vector<vector<int>>& grid) {
return build(grid, , , grid.size() - , grid.size() - );
}
Node* build(vector<vector<int>>& grid, int r1, int c1, int r2, int c2) {
if (r1 > r2 || c1 > c2) return NULL;
bool isLeaf = true;
int val = grid[r1][c1], rowMid = (r1 + r2) / , colMid = (c1 + c2) / ;
for (int i = r1; i <= r2; ++i) {
for (int j = c1; j <= c2; ++j) {
if (grid[i][j] != val) {
isLeaf = false;
break;
}
}
}
if (isLeaf) return new Node(val == , true, NULL, NULL, NULL, NULL);
return new Node(false, false,
build(grid, r1, c1, rowMid, colMid),
build(grid, r1, colMid + , rowMid, c2),
build(grid, rowMid + , c1, r2, colMid),
build(grid, rowMid + , colMid + , r2, c2));
}
};
参考资料:
https://leetcode.com/problems/construct-quad-tree/
https://leetcode.com/problems/construct-quad-tree/discuss/151j684/Recursive-Java-Solution
https://leetcode.com/problems/construct-quad-tree/discuss/154420/My-Java-Recursive-Solution
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Construct Quad Tree 建立四叉树的更多相关文章
- [LeetCode] Quad Tree Intersection 四叉树相交
A quadtree is a tree data in which each internal node has exactly four children: topLeft, topRight, ...
- 【leetcode】427. Construct Quad Tree
problem 427. Construct Quad Tree 参考 1. Leetcode_427. Construct Quad Tree; 完
- LeetCode:Construct Binary Tree from Inorder and Postorder Traversal,Construct Binary Tree from Preorder and Inorder Traversal
LeetCode:Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder trav ...
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- 【LeetCode】427. Construct Quad Tree 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- [LeetCode&Python] Problem 427. Construct Quad Tree
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...
- leetcode 427. Construct Quad Tree
We want to use quad trees to store an N x N boolean grid. Each cell in the grid can only be true or ...
- Leetcode, construct binary tree from inorder and post order traversal
Sept. 13, 2015 Spent more than a few hours to work on the leetcode problem, and my favorite blogs ab ...
- LeetCode: Construct Binary Tree from Inorder and Postorder Traversal 解题报告
Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...
随机推荐
- html css hover也会冒泡
<HEAD> <style type="text/css"> div:hover { color:blue !important; } </style ...
- Geometric regularity criterion for NSE: the cross product of velocity and vorticity 2: $u\times \om\cdot \n\times \om$
在 [Lee, Jihoon. Notes on the geometric regularity criterion of 3D Navier-Stokes system. J. Math. Phy ...
- 解压unzip的用法
1.把文件解压到当前目录下 [root@instance-q6z0ksfb xmerge_test]# unzip db1.zip 2.把文件解压到指定的目录下,需要用到-d参数. unzip -d ...
- 【原创】大数据基础之Airflow(1)简介、安装、使用
airflow 1.10.0 官方:http://airflow.apache.org/ 一 简介 Airflow is a platform to programmatically author, ...
- 【batch】命令对比两个文件夹下的文件(增删改的对比)
1.分别打印两个目录的结构 TREE D:\SOURCE /A /F >D:\SOURCE.TXT TREE D:\DEST /A /F >D:\DEST.TXT 2.然后使用工具/命令进 ...
- android开源框架讲解 一 butterknif
2019年3月16日 12:49:38 一 直接进入主题 如何配置ButterKnif 我用的是AS3.1.2 应该跟版本关系不大 1.1 下载安装Android ButterKnif Zelezny ...
- 十一Python之路,Day6 - 面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战& ...
- Python知识目录
目录 一.计算机基础 二.Python基础 三.函数 四.常用模块 五.模块和包 六.面向对象 七.网络编程socket 八.数据库 九.前端 十.Python Web框架 十一.版本控制--GIT ...
- 用什么方法给PDF添加页眉页脚
我们所看到的书本中都会设置好有页眉页脚,那么电子书想要添加页眉页脚要怎么操作呢,用什么方法可以在PDF中添加页眉页脚呢,今天就为大家分享一下,如何在电子文件中添加页眉页脚,想知道的小伙伴们就一起来看看 ...
- IISARR方式整合Tomcat失敗
需要在IIS安裝ARR 目标服务器:targetServer 配置反向代理的服务器:reveseProxServer 1.确定最终访问的网址:比如www.baidu.com .www.csdn.ne ...