Python實現 建立四叉樹 的一種方法

2021-08-29 16:29:04 字數 3677 閱讀 1446

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

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

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

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

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

對應的四叉樹應該像下面這樣,每個結點由一對(isleaf, val)所代表.

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

def

construct

(self, grid)

:"""

:type grid: list[list[int]]

:rtype: node

"""import numpy as np #引入numpy

iflen

(grid)==1

:#矩陣為1階

return node(grid[0]

[0],

true

,none

,none

,none

,none

) real =

false

fatal =

false

for row in grid:

#判斷當前矩陣的真假值

iftrue

in row:

real =

true

iffalse

in row:

fatal =

true

if real and fatal:

break

if real and

not fatal:

#當前矩陣為真

return node(

true

,true

,none

,none

,none

,none)if

not real and fatal:

#當前矩陣為假

return node(

false

,true

,none

,none

,none

,none

)if real and fatal:

#當前矩陣既包含真值又包含假值

grid = np.array(grid)

#二維列表轉陣列,方便下標操作

topleft = self.construct(grid[0:

len(grid)//2

,0:len

(grid)//2

].tolist())

topright = self.construct(grid[0:

len(grid)//2

,len

(grid)//2

:].tolist())

bottomleft = self.construct(grid[

len(grid)//2

:,0:

len(grid)//2

].tolist())

bottomright = self.construct(grid[

len(grid)//2

:,len(grid)//2

:].tolist())

return node(

"*",

false

, topleft, topright, bottomleft, bottomright)

def

construct

(self, grid)

:"""

:type grid: list[list[int]]

:rtype: node

"""iflen

(grid)==1

:#矩陣為1階

return node(grid[0]

[0],

true

,none

,none

,none

,none

) real =

false

fatal =

false

for row in grid:

#判斷當前矩陣的真假值

iftrue

in row:

real =

true

iffalse

in row:

fatal =

true

if real and fatal:

break

if real and

not fatal:

#當前矩陣為真

return node(

true

,true

,none

,none

,none

,none)if

not real and fatal:

#當前矩陣為假

return node(

false

,true

,none

,none

,none

,none

)if real and fatal:

#當前矩陣既包含真值又包含假值,將矩陣等分四份

topleft = self.construct(

[row[0:

len(grid)//2

]for row in grid[0:

len(grid)//2

]]) topright = self.construct(

[row[

len(grid)//2

:]for row in grid[0:

len(grid)//2

]]) bottomleft = self.construct(

[row[0:

len(grid)//2

]for row in grid[

len(grid)//2

:]])

bottomright = self.construct(

[row[

len(grid)//2

:]for row in grid[

len(grid)//2

:]])

return node(

"*",

false

, topleft, topright, bottomleft, bottomright)

演算法題來自:

427 建立四叉樹

我們想要使用一棵四叉樹來儲存乙個n x n的布林值網路。網路中每一格的值只會是真或假。樹的根結點代表整個網路。對於每個結點,它將被分等成四個孩子結點直到這個區域內的值都是相同的.每個結點還有另外兩個布林變數 isleaf和val。isleaf當這個節點是乙個葉子結點時為真。val變數儲存葉子結點所代...

Leetcode 427 建立四叉樹

我們想要使用一棵四叉樹來儲存乙個 n x n 的布林值網路。網路中每一格的值只會是真或假。樹的根結點代表整個網路。對於每個結點,它將被分等成四個孩子結點直到這個區域內的值都是相同的.每個結點還有另外兩個布林變數 isleaf 和 val。isleaf 當這個節點是乙個葉子結點時為真。val 變數儲存...

二叉樹的建立(python)

1 構造器,定義乙個構造器,用來構造樹。2 向樹中新增資料。如圖我們定義了這樣一顆二叉樹,我們用 來建立它 用 實現,如下 coding utf 8 class treenode object def init self,data none,left none,right none self.dat...