leetcode 427. Construct Quad Tree
We want to use quad trees to store an N x N
boolean grid. Each cell in the grid can only be true or false. The root node represents the whole grid. For each node, it will be subdivided into four children nodes until the values in the region it represents are all the same.
Each node has another two boolean attributes : isLeaf
and val
. isLeaf
is true if and only if the node is a leaf node. The val
attribute for a leaf node contains the value of the region it represents.
Your task is to use a quad tree to represent a given grid. The following example may help you understand the problem better:
Given the 8 x 8
grid below, we want to construct the corresponding quad tree:
It can be divided according to the definition above:
The corresponding quad tree should be as following, where each node is represented as a (isLeaf, val)
pair.
For the non-leaf nodes, val
can be arbitrary, so it is represented as *
.
Note:
N
is less than1000
and guaranteened to be a power of 2.- If you want to know more about the quad tree, you can refer to its wiki.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | """ # Definition for a QuadTree node. class Node(object): 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( object ): def construct( self , grid): """ :type grid: List[List[int]] :rtype: Node """ def construct2(g, i1, j1, n): s = g[i1][j1] is_same = True for i in xrange (i1, i1 + n): for j in xrange (j1, j1 + n): if g[i][j] ! = s: is_same = False break if is_same: return Node(s, True , None , None , None , None ) else : root = Node( "*" , False , None , None , None , None ) root.topLeft = construct2(g, i1, j1, n / 2 ) root.topRight = construct2(g, i1, j1 + n / 2 , n / 2 ) root.bottomLeft = construct2(g, i1 + n / 2 , j1, n / 2 ) root.bottomRight = construct2(g, i1 + n / 2 , j1 + n / 2 , n / 2 ) return root return construct2(grid, 0 , 0 , len (grid)) |
其他解法,直接是dfs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution: def construct( self , grid): def dfs(x, y, l): if l = = 1 : node = Node(grid[x][y] = = 1 , True , None , None , None , None ) else : tLeft = dfs(x, y, l / / 2 ) tRight = dfs(x, y + l / / 2 , l / / 2 ) bLeft = dfs(x + l / / 2 , y, l / / 2 ) bRight = dfs(x + l / / 2 , y + l / / 2 , l / / 2 ) value = tLeft.val or tRight.val or bLeft.val or bRight.val if tLeft.isLeaf and tRight.isLeaf and bLeft.isLeaf and bRight.isLeaf and tLeft.val = = tRight.val = = bLeft.val = = bRight.val: node = Node(value, True , None , None , None , None ) else : node = Node(value, False , tLeft, tRight, bLeft, bRight) return node return grid and dfs( 0 , 0 , len (grid)) or None |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」