大家好,我是 @负雪明烛。👈👈 点击关注,优质题解不间断。
题目大意
题目很长,但是不要害怕。
题目所说的四分树,其实就是用来表示矩阵数据的一种数据结构。
把一个边长为 2 的幂的正方形均分成 4 块,然后再均分到不能均分为止即为叶子节点。
树的节点分成两种:一种是叶子节点(矩阵内所有的取值一样),一种不是叶子节点(矩阵内的取值不一样,需要继续细分)。
具体地建立四叉树的过程,可以参考我画的图进行理解:
解题方法
首先,这种结构就是「树」,肯定使用递归求解。重要的是如何判断此树结构如何判断叶子节点、val
。
所以定义了一个新的函数isQuadTree
:
- 如果一个正方形中所有的数字都是 ,则
val
是 True; - 如果一个正方形中所有的数字都是 ,则
val
是 False。 - 否则,说明格子里的值不都是相同的,返回 None.
判断 leaf
的方法是看看格子里的所有的值是不是相同的,如果全是 或者 那么就是 leaf
,否则就不是 leaf
。
其他的难点就在把正方形进行切分成四块了,这个不是难点。
"""
# Definition for a QuadTree node.
class Node:
def __init__(self, val, isLeaf, topLeft, topRight, bottomLeft, bottomRight):
self.val = val
self.isLeaf = isLeaf
self.topLeft = topLeft
self.topRight = topRight
self.bottomLeft = bottomLeft
self.bottomRight = bottomRight
"""
class Solution:
def construct(self, grid):
"""
:type grid: List[List[int]]
:rtype: Node
"""
isLeaf = self.isQuadTree(grid)
_len = len(grid)
if isLeaf == None:
mid = _len // 2
topLeftGrid = [[grid[i][j] for j in range(mid)] for i in range(mid)]
topRightGrid = [[grid[i][j] for j in range(mid, _len)] for i in range(mid)]
bottomLeftGrid = [[grid[i][j] for j in range(mid)] for i in range(mid, _len)]
bottomRightGrid = [[grid[i][j] for j in range(mid, _len)] for i in range(mid, _len)]
node = Node(True, False, self.construct(topLeftGrid), self.construct(topRightGrid),
self.construct(bottomLeftGrid), self.construct(bottomRightGrid))
elif isLeaf == False:
node = Node(False, True, None, None, None, None)
else:
node = Node(True, True, None, None, None, None)
return node
def isQuadTree(self, grid):
_len = len(grid)
_sum = 0
for i in range(_len):
_sum += sum(grid[i])
if _sum == _len ** 2:
return True
elif _sum == 0:
return False
else:
return None
总结
- 重点是理解题意!递归并不难。
我是 @负雪明烛 ,刷算法题 1000 多道,写了 1000 多篇算法题解,收获阅读量 300 万。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。
- 在刷题的时候,如果你不知道该怎么刷题,可以看 LeetCode 应该怎么刷?
- 如果你觉得题目太多,想在短时间内快速提高,可以看 LeetCode 最经典的 100 道题。
- 送你一份刷题的代码模板:【LeetCode】代码模板,刷题必会