LeetCode 558
看到题目之后,想到一个直接的方法是,把4叉树转换会N grid,然后做完或之后,转会4叉树。但是这样做也比较麻烦。
考虑直接在4叉树上做或的操作,考虑第一层,可能的情况是,
- 两个都是叶子节点,那么我们可以直接做或操作得到结果
- 一个是叶子节点,另外一个不是,叶子节点的值如果是1,那么最后结果应该都是1, 叶子节点是0,那么最后结果应该等于另外一个节点
- 如果两个都不是叶子节点,那么可以递归求解出来四个叶子节点的结果。最后看看是否需要聚合成一个叶子节点。
这样的话看上去递归就可以求解。
def intersect(self, quadTree1: Node, quadTree2: Node) -> Node:
def dfs(qt1:Node, qt2:Node)->Node:
if qt1 == None and qt2 == None: return None
if qt1.isLeaf == 1 and qt2.isLeaf == 1:
qt1.val = qt1.val | qt2.val
return qt1
elif qt1.isLeaf == 1 and qt2.isLeaf == 0:
return qt1 if qt1.val == 1 else qt2
elif qt2.isLeaf == 1 and qt1.isLeaf == 0:
return qt2 if qt2.val == 1 else qt1
else:
result = Node(0, 0, None, None, None, None)
result.topLeft = dfs(qt1.topLeft, qt2.topLeft)
result.topRight = dfs(qt1.topRight, qt2.topRight)
result.bottomLeft = dfs(qt1.bottomLeft, qt2.bottomLeft)
result.bottomRight = dfs(qt1.bottomRight, qt2.bottomRight)
if (result.topLeft.val == result.topRight.val == result.bottomLeft.val == result.bottomRight.val and
result.topLeft.isLeaf == result.topRight.isLeaf == result.bottomLeft.isLeaf == result.bottomRight.isLeaf == 1):
return Node(result.topLeft.val, 1, None, None, None, None)
return result
return dfs(quadTree1, quadTree2)