1. 程式人生 > >leetcode之Construct Quad Tree(427)

leetcode之Construct Quad Tree(427)

題目:

我們想要使用一棵四叉樹來儲存一個 N x N 的布林值網路。網路中每一格的值只會是真或假。樹的根結點代表整個網路。對於每個結點, 它將被分等成四個孩子結點直到這個區域內的值都是相同的.

每個結點還有另外兩個布林變數: isLeaf 和 valisLeaf 當這個節點是一個葉子結點時為真。val 變數儲存葉子結點所代表的區域的值。

你的任務是使用一個四叉樹表示給定的網路。下面的例子將有助於你理解這個問題:

給定下面這個8 x 8 網路,我們將這樣建立一個對應的四叉樹:

由上文的定義,它能被這樣分割:

對應的四叉樹應該像下面這樣,每個結點由一對 (isLeaf, val)

 所代表.

對於非葉子結點,val 可以是任意的,所以使用 * 代替。

提示:

  1. N 將小於 1000 且確保是 2 的整次冪。
  2. 如果你想了解更多關於四叉樹的知識,你可以參考這個 wiki 頁面。

python程式碼:

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):
        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