四叉树交集

简介: 四叉树交集

一、题目描述:

二进制矩阵中的所有元素不是 0 就是 1 。

给你两个四叉树,quadTree1 和 quadTree2。其中 quadTree1 表示一个 n n 二进制矩阵,而 quadTree2 表示另一个 n n 二进制矩阵。

请你返回一个表示 n * n 二进制矩阵的四叉树,它是 quadTree1 和 quadTree2 所表示的两个二进制矩阵进行 按位逻辑或运算 的结果。

注意,当 isLeaf 为 False 时,你可以把 True 或者 False 赋值给节点,两种值都会被判题机制 接受 。

四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:

val:储存叶子结点所代表的区域的值。1 对应 True,0 对应 False;
isLeaf: 当这个节点是一个叶子结点时为 True,如果它有 4 个子节点则为 False 。
class Node {

public boolean val;
public boolean isLeaf;
public Node topLeft;
public Node topRight;
public Node bottomLeft;
public Node bottomRight;

}
我们可以按以下步骤为二维区域构建四叉树:

如果当前网格的值相同(即,全为 0 或者全为 1),将 isLeaf 设为 True ,将 val 设为网格相应的值,并将四个子节点都设为 Null 然后停止。
如果当前网格的值不同,将 isLeaf 设为 False, 将 val 设为任意值,然后如下图所示,将当前网格划分为四个子网格。
使用适当的子网格递归每个子节点。

如果你想了解更多关于四叉树的内容,可以参考 wiki 。

四叉树格式:

输出为使用层序遍历后四叉树的序列化形式,其中 null 表示路径终止符,其下面不存在节点。

它与二叉树的序列化非常相似。唯一的区别是节点以列表形式表示 [isLeaf, val] 。

如果 isLeaf 或者 val 的值为 True ,则表示它在列表 [isLeaf, val] 中的值为 1 ;如果 isLeaf 或者 val 的值为 False ,则表示值为 0 。

示例 1:

输入:quadTree1 = [[0,1],[1,1],[1,1],[1,0],[1,0]]
, quadTree2 = [[0,1],[1,1],[0,1],[1,1],[1,0],null,null,null,null,[1,0],[1,0],[1,1],[1,1]]
输出:[[0,0],[1,1],[1,1],[1,1],[1,0]]
解释:quadTree1 和 quadTree2 如上所示。由四叉树所表示的二进制矩阵也已经给出。
如果我们对这两个矩阵进行按位逻辑或运算,则可以得到下面的二进制矩阵,由一个作为结果的四叉树表示。
注意,我们展示的二进制矩阵仅仅是为了更好地说明题意,你无需构造二进制矩阵来获得结果四叉树。

示例 2:

输入:quadTree1 = [[1,0]]
, quadTree2 = [[1,0]]
输出:[[1,0]]
解释:两个数所表示的矩阵大小都为 1*1,值全为 0
结果矩阵大小为 1*1,值全为 0 。
示例 3:

输入:quadTree1 = [[0,0],[1,0],[1,0],[1,1],[1,1]]
, quadTree2 = [[0,0],[1,1],[1,1],[1,0],[1,1]]
输出:[[1,1]]
示例 4:

输入:quadTree1 = [[0,0],[1,1],[1,0],[1,1],[1,1]]
, quadTree2 = [[0,0],[1,1],[0,1],[1,1],[1,1],null,null,null,null,[1,1],[1,0],[1,0],[1,1]]
输出:[[0,0],[1,1],[0,1],[1,1],[1,1],null,null,null,null,[1,1],[1,0],[1,0],[1,1]]
示例 5:

输入:quadTree1 = [[0,1],[1,0],[0,1],[1,1],[1,0],null,null,null,null,[1,0],[1,0],[1,1],[1,1]]
, quadTree2 = [[0,1],[0,1],[1,0],[1,1],[1,0],[1,0],[1,0],[1,1],[1,1]]
输出:[[0,0],[0,1],[0,1],[1,1],[1,0],[1,0],[1,0],[1,1],[1,1],[1,0],[1,0],[1,1],[1,1]]

提示:

quadTree1 和 quadTree2 都是符合题目要求的四叉树,每个都代表一个 n * n 的矩阵。
n == 2^x ,其中 0 <= x <= 9.

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/logical-or-of-two-binary-grids-represented-as-quad-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

如果任何一个节点为叶子节点且值为1,则返回一个新的值为1的叶子节点。因为1或任何值依旧为1。
如果一个节点为叶子节点且值为0,则返回另一个节点。因为或0操作不会改变值。
两个非叶子节点的合并,需要新建节点,并对四个子节点递归调用。
步骤3中形成的新节点,需要做合并检查。如果四个子节点都是叶子节点且值相同,则必须做合并操作,这样才符合四叉树的定义。

三、AC 代码:

class Solution {
    public Node intersect(Node quadTree1, Node quadTree2) {
        if( (quadTree1.isLeaf && quadTree1.val==true) ||
            (quadTree2.isLeaf && quadTree2.val==true) ){
                return new Node(true, true, null, null, null, null);
            }
        if(quadTree1.isLeaf && quadTree1.val==false) return quadTree2;
        if(quadTree2.isLeaf && quadTree2.val==false) return quadTree1;
        Node res = new Node(false, false, 
                            intersect(quadTree1.topLeft, quadTree2.topLeft), 
                            intersect(quadTree1.topRight, quadTree2.topRight), 
                            intersect(quadTree1.bottomLeft, quadTree2.bottomLeft), 
                            intersect(quadTree1.bottomRight, quadTree2.bottomRight));
        //union node if possible
        if(res.topLeft.isLeaf &&
        res.topRight.isLeaf &&
        res.bottomLeft.isLeaf &&
        res.bottomRight.isLeaf &&
        res.topRight.val == res.topLeft.val &&
        res.bottomLeft.val == res.topLeft.val &&
        res.bottomRight.val == res.topLeft.val){
            res = new Node(res.topLeft.val, true, null, null, null, null);
        }
        return res;
    }
}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

相关文章
|
2月前
|
存储
349 两个数组的交集、350 两个数组的交集、242 有效字母的异位词(2021-11-07)
349 两个数组的交集、350 两个数组的交集、242 有效字母的异位词(2021-11-07)
25 1
|
7月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
7月前
|
算法 测试技术 C#
【键值皆有序map 线段树 数学 】100240. 最小化曼哈顿距离
【键值皆有序map 线段树 数学 】100240. 最小化曼哈顿距离
|
JavaScript 前端开发 算法
日拱算法:两个数组的交集(I、II)
本篇带来两个数组的交集(I、II)之双指针解法~ 冲就完事了~
|
存储 算法 Go
算法练习第六天——两个数组的交集
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
两个有序链表序列的交集
两个有序链表序列的交集
121 0