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:

LeetCode 427. Construct Quad Tree_第1张图片
image

It can be divided according to the definition above:

LeetCode 427. Construct Quad Tree_第2张图片
image

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 *.

LeetCode 427. Construct Quad Tree_第3张图片
image

Note:

  1. N is less than 1000 and guaranteened to be a power of 2.
  2. If you want to know more about the quad tree, you can refer to its wiki.

解析

题目挺长的,容易被吓到。认真分析一下,主要是根据一个正方形的二维数组List[List[int]]建立一个四叉树,在建立过程中对四叉树有这样的要求:

  1. 正方形进行分割;
  2. 正方形中全是0或1,则为leaf(叶子);
  3. 全为1的叶子其val为True,全为0的叶子其val为False;
  4. 非叶子结点,其val为*。

这样一分析,其实就显而易见了,使用递归可以一层一层的进行剥离,最终到达叶子结点。但是要注意在传参数的时候要将4个方向的grid进行区分。

代码(python)

class Solution(object):
    def construct(self, grid):
        """
        :type grid: List[List[int]]
        :rtype Node
        """
        if not grid:
            return None

        if self.isLeaf(grid):
            return Node(grid[0][0] == 1, True, None, None, None, None)

        N = len(grid)

        return Node('*', False,
                    self.construct([rows[:N//2] for rows in grid[:N//2]]),
                    self.construct([rows[N//2:] for rows in grid[:N//2]]),
                    self.construct([rows[:N//2] for rows in grid[N//2:]]),
                    self.construct([rows[N//2:] for rows in grid[N//2:]]))

    def isLeaf(self, grid):
        if not grid:
            return True

        tmpSet = set()

        for row in grid:
            for col in range(len(row)):
                tmpSet.add(row[col])
            if len(tmpSet) > 1:
                return False

        return True

代码中需要注意的是rows[:N//2],除法为//,否则会报“TypeError: slice indices must be integers or None or have an index method”错误。

你可能感兴趣的:(LeetCode 427. Construct Quad Tree)