这是悦乐书的第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实现)的更多相关文章

  1. LeetCode算法题-Symmetric Tree(Java实现)

    这是悦乐书的第163次更新,第165篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第22题(顺位题号是101).给定二叉树,检查它是否是自身的镜像(即,围绕其中心对称). ...

  2. LeetCode算法题-Same Tree(Java实现)

    这是悦乐书的第162次更新,第164篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第21题(顺位题号是100).给定两个二叉树,编写一个函数来检查它们是否相同.如果两个二 ...

  3. LeetCode算法题-N-ary Tree Postorder Traversal(Java实现)

    这是悦乐书的第269次更新,第283篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是590).给定一个n-ary树,返回其节点值的后序遍历.例如,给定 ...

  4. LeetCode算法题-N-ary Tree Preorder Traversal(Java实现)

    这是悦乐书的第268次更新,第282篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第135题(顺位题号是589).给定一个n-ary树,返回其节点值的前序遍历.例如,给定 ...

  5. LeetCode算法题-Binary Tree Tilt(Java实现)

    这是悦乐书的第263次更新,第276篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第130题(顺位题号是563).给定二叉树,返回整棵树的倾斜度.树节点的倾斜被定义为所有 ...

  6. LeetCode算法题-N-ary Tree Level Order Traversal(Java实现)

    这是悦乐书的第225次更新,第238篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第92题(顺位题号是429).给定n-ary树,返回其节点值的级别顺序遍历.(即,从左到 ...

  7. LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

    这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...

  8. LeetCode算法题-Binary Tree Level Order Traversal II(Java实现)

    这是悦乐书的第165次更新,第167篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第24题(顺位题号是107).给定二叉树,返回其节点值的自下而上级别顺序遍历(即从左到右 ...

  9. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

随机推荐

  1. Python内置函数(12)——compile

    英文文档: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) Compile the source i ...

  2. 12.Flask-Restful

    定义Restful的视图 安装:pip install flask-restful 如果使用Flask-restful,那么定义视图函数的时候,就要继承flask_restful.Resourse类, ...

  3. expect--自动批量分发公钥脚本

    1.在使用之前,先安装epel源,yum install expect -y2.写分发脚本,后缀为exp #!/usr/bin/expect set host_ip [lindex $argv 0] ...

  4. IdentityServer Topics(7)- 注销

    注销IdentityServer与删除身份cookie一样简单,但是我们必须考虑将用户从客户端应用程序(甚至可能是上游身份提供程序)中注销. 一.删除身份认证Cookie 要删除身证认证cookie, ...

  5. mybatis中resultMap配置细则

    resultMap算是mybatis映射器中最复杂的一个节点了,能够配置的属性较多,我们在mybatis映射器配置细则这篇博客中已经简单介绍过resultMap的配置了,当时我们介绍了resultMa ...

  6. javascript深入理解js闭包(转载)

    此篇文章来源于http://www.jb51.net/article/24101.htm 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全 ...

  7. Java的类加载器种类(双亲委派)

    Java类加载器采用双亲委派模型: 1.启动类加载器:这个类加载器负责放在<JAVA_HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别 ...

  8. 客户端缓存机制 - Cookie详解

    Cookie 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] Cookie不是内置对象,所以用的时候需要new出来,Cookie是由服务端产生的,再发送给客户端保存,它不是内置对象,却是 ...

  9. [转]Centos 7搭建Gitlab服务器超详细

    本文转自:https://blog.csdn.net/duyusean/article/details/80011540 可参考:https://about.gitlab.com/install/#c ...

  10. 查看Windows电脑上.NET Framework版本的方法(找了好久的方法)

    照网上大多数人的方法,在路径 C:\Windows\Microsoft.NET\Framework 下可以查看到.NET Framework的版本,不过无论Win7还是Win10,显示都是这样的: 那 ...