tree
dfs
recursion
]
Leetcode 0427 Construct Quad Tree
Problem statement
https://leetcode.com/problems/construct-quad-tree/
Solution
Basically do, what is asked to do: on each step check if all elements are equal, and if not, run recursion. Time complexity of this approach is O(n^2 log n)
, because equation is $T(n) = 4\cdot T(n/2) + O(n^2)$.
We can also do it in O(n^2)
time if we use helper dfs function: to evaluate if for some sub-array all elements are equal we need to check if they are equal for 4
parts and also check that they are equal to each other. I use dfs(x1, y1, x2, y2)
function, and return leaf if x2 = x1 + 1
. Then recursively call function 4
times and if we have all 4
children which are leafs and they have equal value, we return Node(val, 1, None, None, None, None)
, so we can say we delete links to previous leafs. If not all children are leafs or they have different values, return Node(1, 0, N1, N2, N3, N4)
, where N1, N2, N3, N4
are recursively called function for 4 sub-arrays.
Complexity
Time complexity is O(n^2)
, space is O(n^2)
as well.
Code
class Solution:
def construct(self, grid):
def dfs(x1, y1, x2, y2):
if x2 - x1 == 1:
return Node(grid[x1][y1], 1, None, None, None, None)
xm, ym = (x1+x2)//2, (y1+y2)//2
N1 = dfs(x1, y1, xm, ym)
N2 = dfs(x1, ym, xm, y2)
N3 = dfs(xm, y1, x2, ym)
N4 = dfs(xm, ym, x2, y2)
isLeafNew = N1.isLeaf and N2.isLeaf and N3.isLeaf and N4.isLeaf
isEqual = N1.val==N2.val and N2.val==N3.val and N3.val == N4.val
if isLeafNew and isEqual:
return Node(N1.val, 1, None, None, None, None)
else:
return Node(1, 0, N1, N2, N3, N4)
return dfs(0, 0, len(grid), len(grid))