我有一棵樹,如下所示。如何遍歷具有特定屬性的樹
- 紅色表示它有一定的屬性,未填充表示它沒有它。我想盡量減少
Red
檢查。- 如果
Red
比所有祖先也都Red
(不應再次檢查)。 - 如果
Not Red
比所有後裔都Not Red
。
- 如果
- 樹的深度爲
d
。 - 樹的寬度是
n
。 請注意,子節點的值大於父級。
- 實施例:在下面的樹中,
- 節點 '0' 具有子[1,2,3],
- 節點 '1' 具有子[2,3],
- 節點'2'有孩子[3]和
- 節點'4'有孩子[](沒有孩子)。
因此孩子們可以設計爲:
if vertex.depth > 0: vertex.children = [Vertex(parent=vertex, val=child_val, depth=vertex.depth-1, n=n) for child_val in xrange(self.val+1, n)] else: vertex.children = []
- 實施例:在下面的樹中,
下面是一個例子樹:
我想算的數Red
節點。樹的深度和寬度都會很大。所以我想做一種Depth-First-Search,並且使用上面的屬性1和2。
如何設計算法來遍歷該樹?
PS:我標記了這個[python],但算法的任何輪廓都可以。
更新&背景
- 我希望儘量減少財產檢查。
- 屬性檢查是檢查從我樹的路徑構建的二分圖的連通性。 例:
- 在示例樹中的左下節點具有路徑 = [0,1]。
- 讓該二部圖具有大小爲
r
和c
的集合R
和C
。(注意樹的寬度是n=r*c
)。 - 從路徑我通過從完整圖開始,並刪除路徑中所有值的邊(x,y),從而得到圖的邊:
x, y = divmod(value, c)
。
爲屬性檢查來自圖的連通的兩個規則: - 如果圖形與邊[A,B,C]除去,那麼它也必須有連接連接[ a,b]被刪除(規則1)。 - 如果圖形與邊緣[a,b,c]斷開連接,則它還必須與刪除的附加邊緣[a,b,c,d](規則2)斷開連接。
更新2
所以我真正想要做的是檢查採摘d元素出來[0到n]的所有組合。樹結構有點幫助,但即使我得到了最佳的樹遍歷算法,我仍然會檢查太多的組合。 (我剛纔注意到了。)
讓我解釋一下。假設我需要檢查[4,5](所以4和5從上面解釋的二分圖中刪除,但在這裏無關)。如果這出現「紅色」,我的樹會阻止我僅檢查[4]。那很好。但是,我也應該檢查[5]。
如何更改我的樹的結構(可能是圖形)以進一步最小化我的檢查次數?
由於節點3,節點1不應該因屬性(1)而變爲紅色,否則節點3因屬性(2)而不會變紅? – templatetypedef
是的,你是對的。繪製樹時我犯了一個錯誤。將解決。 – Unapiedra
樹如何表示?你可以訪問任何你想要的節點,或只是根? – templatetypedef