leetcode-每日一题558. 四叉树交集(分治递归)

简介: 时间复杂度:O(n2),其中 n 是四叉树 quadTree1 和 quadTree2 对应矩阵的边长。最坏的情况下,整个矩阵都会被遍历

bf391148f7d64b50bd17724c579531df.png

b60af6e05f6b4441bb3220433286afe3.png


题目链接:https://leetcode.cn/problems/logical-or-of-two-binary-grids-represented-as-quad-trees/


思路


方法一、分治递归


直接想法


四叉树相当于一个 n * n 的矩阵,四个节点又分成了父节点的矩阵的四个区域


  • topLeft 节点为其父节点对应的矩阵区域左上角的 1/4 区域。
  • topRight 节点为其父节点对应的矩阵区域右上角的 1/4 区域。
  • bottomLeft 节点为其父节点对应的矩阵区域左下角的 1/4 区域。
  • bottomRight 节点为其父节点对应的矩阵区域右下角的1/4 区域。


9ac2368aba5a444dbebf692a40b0081b.png


题目要求我们合并两颗四叉树 quadTree1 和 quadTree2,合并的方式就是把这矩阵中对应的四个区域的Val值进行 或 操作


或操作:x ∈ {0,1}, 0 | x = x, 1 | x = 1


所以我们需要把这两棵树对应的结合进行合并,设当前操作的两个结点为 node1 和 node2, 合并操作为 node1 | node2


1.node1是叶结点

1)node1.Val 为1 ,那么 node1 | node2 = 1

2)node1.Val 为0,那么 node1 | node2 = node2


2.node2是叶结点

1)node2.Val 为1 ,那么 node1 | node2 = 1

2)node2.Val 为0,那么 node1 | node2 = node1


3.两个结点都不是叶结点,则我们需要对两个结点的四个子节点分别进行分治递归操作,重复上面合并操作,然后再判断合并后的四个子结点是否对应的区域值都为全0 或者 全1,如果是则合并结点为叶子节点,反之则不是叶子节点,且四个子节点的值为上面合并操作后的四个对应子节点值


代码示例


/**
 * Definition for a QuadTree node.
 * type Node struct {
 *     Val bool
 *     IsLeaf bool
 *     TopLeft *Node
 *     TopRight *Node
 *     BottomLeft *Node
 *     BottomRight *Node
 * }
 */
func intersect(quadTree1, quadTree2 *Node) *Node {
    //node1是叶子节点
    if quadTree1.IsLeaf {
        //node1值为1,则直接合并
        if quadTree1.Val {
            return &Node{Val: true, IsLeaf: true}
        }
        //node1 | node2 = node2
        return quadTree2
    }
    //node2是叶子节点
    if quadTree2.IsLeaf {
        //合并两个结点
        return intersect(quadTree2, quadTree1)
    }
    //合并左上区域
    TL := intersect(quadTree1.TopLeft, quadTree2.TopLeft)
    //合并右上区域
    TR := intersect(quadTree1.TopRight, quadTree2.TopRight)
    //合并左下区域
    BL := intersect(quadTree1.BottomLeft, quadTree2.BottomLeft)
    //合并右下区域
    BR := intersect(quadTree1.BottomRight, quadTree2.BottomRight)
    //判断当前结点是否都是叶子结点并且是否为全0或全1
    if TL.IsLeaf && TR.IsLeaf && BL.IsLeaf && BR.IsLeaf && TL.Val == TR.Val && TL.Val == BL.Val && TL.Val == BR.Val {
        return &Node{Val: TL.Val, IsLeaf: true}
    }
    return &Node{false, false, TL, TR, BL, BR}
}

7e3b34da13fb443f9c825114950c2329.png


复杂度分析


  • 时间复杂度:O(n2),其中 n 是四叉树 quadTree1 和 quadTree2 对应矩阵的边长。最坏的情况下,整个矩阵都会被遍历。


  • 空间复杂度:O(logn),其中 n 是四叉树 quadTree1 和 quadTree2 对应矩阵的边长。空间开销主要为递归的空间开销。
目录
相关文章
|
机器学习/深度学习 存储 算法
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
LeetCode 题目 95:从递归到动态规划实现 不同的二叉搜索树 II
|
11月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
76 0
LeetCode------递归(爬楼梯)
这篇文章通过LeetCode上的"爬楼梯"问题介绍了递归的基本概念和实现方法,包括递归公式的推导、基本递归实现、使用备忘录优化以避免重复计算,以及自底向上的迭代方法来提高效率。
LeetCode------递归(爬楼梯)
|
存储 算法 数据可视化
力扣156题最全解法:如何上下翻转二叉树(递归与迭代方法详解,附图解)
力扣156题最全解法:如何上下翻转二叉树(递归与迭代方法详解,附图解)
|
存储 算法 数据可视化
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树
|
存储 算法 数据可视化
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
LeetCode 131题详解:高效分割回文串的递归与动态规划方法
|
算法 数据可视化 数据挖掘
LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )
LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )
LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
存储 SQL 算法
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
|
存储 算法 数据可视化
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串
LeetCode 题目 97:动态规划、递归到广度优先搜索BFS 实现交错字符串

热门文章

最新文章