这是悦乐书的第260次更新,第273篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第127题(顺位题号是558)。四叉树是树数据,其中每个内部节点恰好有四个子节点:topLeft,topRight,bottomLeft和bottomRight。四叉树通常用于通过递归地将二维空间细分为四个象限或区域来划分二维空间。
我们想在我们的四叉树中存储true/false。四叉树用于表示N * N布尔网格。对于每个节点,它将被细分为四个子节点,直到它所代表的区域中的值全部相同。每个节点都有另外两个布尔属性:isLeaf和val。当且仅当节点是叶节点时,isLeaf才为真。叶节点的val属性包含它所代表的区域的值。
例如,下面是两个四叉树A和B:
A:
+-------+-------+ T: true
| | | F: false
| T | T |
| | |
+-------+-------+
| | |
| F | F |
| | |
+-------+-------+
topLeft: T
topRight: T
bottomLeft: F
bottomRight: F
B:
+-------+---+---+
| | F | F |
| T +---+---+
| | T | T |
+-------+---+---+
| | |
| T | F |
| | |
+-------+-------+
topLeft: T
topRight:
topLeft: F
topRight: F
bottomLeft: T
bottomRight: T
bottomLeft: T
bottomRight: F
您的任务是实现一个将需要两个四叉树并返回表示两棵树的逻辑OR(或并集)的四叉树的函数。
A: B: C (A or B):
+-------+-------+ +-------+---+---+ +-------+-------+
| | | | | F | F | | | |
| T | T | | T +---+---+ | T | T |
| | | | | T | T | | | |
+-------+-------+ +-------+---+---+ +-------+-------+
| | | | | | | | |
| F | F | | T | F | | T | F |
| | | | | | | | |
+-------+-------+ +-------+-------+ +-------+-------+
注意:
A和B都表示大小为N * N的网格。
N保证是2的幂。
如果您想了解有关四叉树的更多信息,可以参考其维基。
逻辑OR运算定义如下:如果A为true,或者如果B为true,或者如果A和B都为true,则“A或B”为true。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 解题
题目描述了一种新的数据结构,四叉树,要求计算出两个四叉树的并集,以一个新的四叉树作为结果返回。
一个四叉树含多个内部节点,每个内部节点拥有四个子节点,每个节点拥有两个属性isLeaf和val,只有四个子节点都是叶子节点时,该节点本身的isLeaf属性才会为true,只有四个子节点的值都相同(都为true或false)时,该节点本身的val属性才会为true或false,与其四个子节点的val值等同。
我们直接使用递归,如果quadTree1活着quadTree2是叶子节点,并且其val属性为true,直接返回quadTree1或quadTree2。如果都不是叶子节点,那么就对其四个子节点作为参数,调用自身,进行二次操作,返回的节点组成新的节点的子节点,接着计算新节点的两个属性isLeaf和val,最后返回该新节点即可。在本题中,我们直接使用quadTree1作为新的节点,当然,你也可以创建一个新的Node对象来承接。
public Node intersect(Node quadTree1, Node quadTree2) {
if (quadTree1.isLeaf) {
return quadTree1.val ? quadTree1 : quadTree2;
}
if (quadTree2.isLeaf) {
return quadTree2.val ? quadTree2 : quadTree1;
}
quadTree1.topLeft = intersect(quadTree1.topLeft, quadTree2.topLeft);
quadTree1.topRight = intersect(quadTree1.topRight, quadTree2.topRight);
quadTree1.bottomLeft = intersect(quadTree1.bottomLeft, quadTree2.bottomLeft);
quadTree1.bottomRight = intersect(quadTree1.bottomRight, quadTree2.bottomRight);
if (quadTree1.topLeft.isLeaf && quadTree1.topRight.isLeaf
&& quadTree1.bottomLeft.isLeaf && quadTree1.bottomRight.isLeaf
&& quadTree1.topLeft.val == quadTree1.topRight.val
&& quadTree1.topRight.val == quadTree1.bottomLeft.val
&& quadTree1.bottomLeft.val == quadTree1.bottomRight.val) {
quadTree1.isLeaf = true;
quadTree1.val = quadTree1.topLeft.val;
}
return quadTree1;
}
03 小结
算法专题目前已日更超过三个月,算法题文章127+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Quad Tree Intersection(Java实现)的更多相关文章
-
LeetCode算法题-Symmetric Tree(Java实现)
这是悦乐书的第163次更新,第165篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第22题(顺位题号是101).给定二叉树,检查它是否是自身的镜像(即,围绕其中心对称). ...
-
LeetCode算法题-Same Tree(Java实现)
这是悦乐书的第162次更新,第164篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第21题(顺位题号是100).给定两个二叉树,编写一个函数来检查它们是否相同.如果两个二 ...
-
LeetCode算法题-N-ary Tree Postorder Traversal(Java实现)
这是悦乐书的第269次更新,第283篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是590).给定一个n-ary树,返回其节点值的后序遍历.例如,给定 ...
-
LeetCode算法题-N-ary Tree Preorder Traversal(Java实现)
这是悦乐书的第268次更新,第282篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第135题(顺位题号是589).给定一个n-ary树,返回其节点值的前序遍历.例如,给定 ...
-
LeetCode算法题-Binary Tree Tilt(Java实现)
这是悦乐书的第263次更新,第276篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第130题(顺位题号是563).给定二叉树,返回整棵树的倾斜度.树节点的倾斜被定义为所有 ...
-
LeetCode算法题-N-ary Tree Level Order Traversal(Java实现)
这是悦乐书的第225次更新,第238篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第92题(顺位题号是429).给定n-ary树,返回其节点值的级别顺序遍历.(即,从左到 ...
-
LeetCode算法题-Binary Tree Paths(Java实现-3种解法)
这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...
-
LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)
这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...
-
LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
随机推荐
-
MarkdownPad 2
摘要 升级到 Windows 10 后 MarkdownPad 2,遇到了html 渲染错误的问题: windows10 MarkdownPad html渲染错误 awesomium 升级到 Wind ...
-
mysql 和字符串截取相关的知识点
LOCATE(',','123,456') - 1) SELECT LEFT('123,456',3); SELECT LEFT('123,456',LOCATE(',','123,456') - 1 ...
-
SGU 164.Airline(结论题)
时间限制:0.25s 空间限制:4M 题意: 在n(1<=n<=200)个点的无向完全图中,有m种不同的边.现在从中选择不超过(m+1)/2种边,使得任意两点可以通过不超过3条边互相到达. ...
-
asp.net微软认证全新考试题库及答案1
1.你创建了一个ASP.net应用程序,该程序将运行在TK公司的WEB站点上.你的应用程序包括100个WEB页面.你想配置你的应用程序,当HTTP代码发生错误时,可显示自定义的错误信息给用户.同时你想 ...
-
NGUI_Atlas
二.NGUI的图集制作: 1.概述: 将导入的图片资源全部制成一张图集,可以节约资源,当制成图集后,就可以将导入的图片资源进行删除, 再后续的操作直接使用图集中的图片即可,NGUI自带的Atlas M ...
-
一次java Cpu占用过高的排查
某一个项目CPU占用率一直很高,经常在40%-50%之间,最近比较闲,就开始了排查工作. 1.通过 jstack命令输出进程的堆栈信息 jstack 2788 >C:\log.txt 将堆栈信息 ...
-
Python和Lua的默认作用域以及闭包
默认作用域 前段时间学了下Lua,发现Lua的默认作用域和Python是相反的.Lua定义变量时默认变量的作用域是全局(global,这样说不是很准确,Lua在执行x = 1这样的语句时会从当前环境开 ...
-
samba需求,请建一个目录,所有用户都可以修改其中的任意文件(新建文件的权限问题)
我的配置如下: [TMP] comment = Public Stuff path = /DATA/samba/tmp public = yes writable = yes create mode ...
-
DataTable表连接
public static System.Data.DataTable TableJoin(System.Data.DataTable dt, System.Data.DataTable dtDeta ...
-
redis安装命令
要进入redis的安装目录: cd 目录 安装命令:redis-server.exe --service-install redis.windows.conf --loglevel verbose 卸 ...