其他分享
首页 > 其他分享> > leetcode 558. 四叉树交集

leetcode 558. 四叉树交集

作者:互联网

二进制矩阵中的所有元素不是 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.com/problems/logical-or-of-two-binary-grids-represented-as-quad-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1:采用前序遍历二叉树的思想。

2:每遍历一次,就创建一个节点。

3:需要注意的地方就是有些节点的合并。

若a节点是叶子节点,并且值为1,不管b中是否还有子节点,都不用再遍历了,其值都肯定为1,新创建的节点的值和a节点的值相同即可。

若a节点是叶子节点,并且值为0,则新创建的节点和b节点相同。

若都不为子节点,则继续递归,再判断4个字节的返回值,若是返回值相同,则可以直接合并为[1,1]

代码有点乱。。。

/*
// Definition for a QuadTree node.
class Node {
    public boolean val;
    public boolean isLeaf;
    public Node topLeft;
    public Node topRight;
    public Node bottomLeft;
    public Node bottomRight;

    public Node() {}

    public Node(boolean _val,boolean _isLeaf,Node _topLeft,Node _topRight,Node _bottomLeft,Node _bottomRight) {
        val = _val;
        isLeaf = _isLeaf;
        topLeft = _topLeft;
        topRight = _topRight;
        bottomLeft = _bottomLeft;
        bottomRight = _bottomRight;
    }
};
*/

class Solution {
  public Node intersect(Node quadTree1, Node quadTree2) {
        return find(quadTree1, quadTree2, false);
    }

    private Node find(Node a, Node b, boolean value) {

        if (a == null && b == null) {
            return null;
        }

        Node no = new Node();
        if (a == null) {

            if (b.isLeaf && b.val) {
                no.isLeaf = true;
                no.val = true;
                return no;
            }
            if (b.isLeaf) {
                no.isLeaf = true;
                no.val = b.val || value;
            } else {
                no.isLeaf = false;
                no.topLeft = find(a, b.topLeft, value);
                no.topRight = find(a, b.topRight, value);
                no.bottomLeft = find(a, b.bottomLeft, value);
                no.bottomRight = find(a, b.bottomRight, value);
            }
            return no;
        }

        if (b == null) {
            if (a.isLeaf) {
                no.isLeaf = true;
                no.val = a.val || value;
            } else {
                no.isLeaf = false;
                no.topLeft = find(a.topLeft, b, value);
                no.topRight = find(a.topRight, b, value);
                no.bottomLeft = find(a.bottomLeft, b, value);
                no.bottomRight = find(a.bottomRight, b, value);
            }
            return no;
        }


        if ((a.isLeaf && a.val) || (b.isLeaf && b.val)) {
            no.isLeaf = true;
            no.val = true;
            return no;
        }
        value = a.isLeaf ? a.val : b.val;
        no.isLeaf = a.isLeaf && b.isLeaf;
        Node n1  = find(a.topLeft, b.topLeft, value);
        Node n2 = find(a.topRight, b.topRight, value);
        Node n3  = find(a.bottomLeft, b.bottomLeft, value);
        Node n4  = find(a.bottomRight, b.bottomRight, value);


        if (n1 != null && n2 != null && n3 != null && n4 != null) {
            if (n1.isLeaf && n2.isLeaf && n3.isLeaf && n4.isLeaf) {

                if (n1.val == n2.val && n2.val == n3.val && n3.val == n4.val) {
                    no.val = true;
                    no.isLeaf = true;
                    return no;
                }
            }
        }

        no.topLeft = n1;
        no.topRight = n2;
        no.bottomLeft = n3;
        no.bottomRight = n4;

        return no;
    }
}

标签:Node,558,val,no,节点,四叉树,null,leetcode,isLeaf
来源: https://www.cnblogs.com/wangzaiguli/p/15133805.html