这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

quadtree java_LeetCode算法题-Quad Tree Intersection(Java实现)相关推荐

  1. quadtree java_LeetCode算法题-Construct Quad Tree(Java实现)

    这是悦乐书的第224次更新,第237篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第91题(顺位题号是427).我们想使用四叉树来存储N×N布尔网格.网格中的每个单元格只 ...

  2. add binary java_LeetCode算法题-Add Binary(Java实现)

    这是悦乐书的第157次更新,第159篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第16题(顺位题号是67).给定两个二进制字符串,返回它们的总和(也是二进制字符串).输 ...

  3. min java_LeetCode算法题-Min Stack(Java实现)

    这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...

  4. island of java_LeetCode算法题-Island Perimeter(Java实现)

    这是悦乐书的第238次更新,第251篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第105题(顺位题号是463).您将获得一个二维整数网格形式的地图,其中1代表土地,0代 ...

  5. largest number java_LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...

  6. java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

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

  7. leetcode 用java_LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  8. power of two java_LeetCode算法题-Power Of Two(Java实现)

    这是悦乐书的第194次更新,第200篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231).给定一个整数,写一个函数来确定它是否是2的幂.例如: 输入 ...

  9. magic square java_LeetCode算法题-Magic Squares In Grid(Java实现)

    这是悦乐书的第326次更新,第349篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840).3 x 3魔方是一个3 x 3网格,填充了从1到9的不同 ...

最新文章

  1. usaco The Perfect Stall(二分匹配模板)
  2. 区块链中的基本概念整理
  3. 前端学习(1800):前端调试之清除浮动练习2
  4. 漫画:数据中台中台建设的十大误区(建议收藏)
  5. LINQ 优点 总结
  6. 通过注册表修改解锁ExtROM
  7. gitlab上传本地项目_环境搭建:gitLab平台的搭建和简单使用
  8. 使用MVC框架中要注意的问题(一):修改首页以支持主题
  9. [转]undefined reference to 问题解决方法
  10. Linux下一次数据仓库进行迁移记录
  11. vscode php断点调试,如何使用vscode断点调试laravel
  12. 怎么用几何画板作一些简单的图形
  13. ug建模和草图切换_从草图到XD,为什么我要切换
  14. 荔枝派zero编译rtl8723bs驱动并连接WiFi
  15. C语言,C++,C#发展的回顾与展望
  16. 2020年如何写一个现代的JavaScript库
  17. 查看树莓派3 WiFi连接速度
  18. c strtok函数用法
  19. 兄弟hl3150cdn打印测试页6_打印性能测试:LED高效输出_兄弟 3150CDN_办公打印评测试用-中关村在线...
  20. android add fragment,Android中使用FragmentTransaction对象的add方法后应用闪退

热门文章

  1. python pandas筛选数据_Python基础 | pandas中数据的筛选(index subset)
  2. MOC3061使用手记
  3. 思维的惯性之游戏中buf管理
  4. c语言数组字节偏移,C语言数组注意问题
  5. 网红“有毒”,被“感染”的短视频、直播平台真能赢得下半场?
  6. Vue+iview将表格table以excel文件导出的几种方式
  7. 我的世界服务器世界文件夹在哪里找,《我的世界》声音文件放哪 声音文件目录怎么找?...
  8. cdo收取邮件_利用CDO发邮件 报错怎么处理
  9. Qt for Android设置应用图标及名称
  10. Android-五子连珠(二)-布局文件