2013-02-17 54 views
0

一段時間以來,我一直在琢磨,尋找這個問題的答案的問題是: 怎樣纔能有效地一個(具體時間而言)列表中的所有葉子樹數據結構的節點下?就通用數據結構而言,如何高效地列出樹數據結構中節點下的所有樹葉?

我最初以爲它可以與所有的葉子節點連接下一個鏈表來完成。

如果這是可能那麼我們就可以通過樹葉爲O(n)的線性時間,其中n是葉子的子樹下的數子樹下迭代。

但是,考慮到每個子樹需要不同的鏈接列表,這聽起來不切實際。

所以,我會感激,如果有人可以點,如果有可能,或者如果它不是,爲什麼?

讓我們在這種情況下考慮一個簡單的二叉樹。

Regards

+0

什麼樣的樹? – 2013-02-17 13:41:51

+0

嗨Yochai,我已經編輯了文本,現在要說清楚。謝謝! – NoOne 2013-02-17 13:45:54

回答

0

這根本不是不切實際的。

你的,你可以設置「下的」葉子,然後在每個節點只存儲指向第一(或最小)的葉,和最後葉每片葉子(大葉)

然後你就可以得到到每個節點(子樹)的第一片葉子並遍歷葉子。

第一個和最後一個葉子可以在O(logn)複雜度插入時更新。

在沒有特殊功能的通用樹
0

以及(每個節點剛剛載荷指數和指向子樹),你必須走在整個樹沒有其他辦法,至少在第一次

比如果你需要用一種快速的方法再次訪問這些葉子節點,你可以設置一個向量/指針數組,讓你幾乎可以進行O(1)次訪問,但是你必須管理這些指針,這樣當你插入新節點你不引用老葉任何以上,但新的

,如果你需要對應於多個子樹一個簡單而快速的解決方案葉可能是一個多維數組在正常circumstan(2D在這種情況下) ces,但如果你的數據集非常大或者內存有限,這可能會成爲一個問題(在這種情況下,你可能需要交換到更適合你需求的內存更好的B +樹)

1

B+ Tree允許指針(next,prev)在葉子之間。假設你所有的數據都存儲在葉級別,那麼B +樹可能是完成你的要求的最佳方式。

enter image description here

如果你問,只是葉子其中有一個共同的根節點(不是整個樹的根)節點,你可以找到根目錄下的最左邊的節點並且繼續跟隨「下「鏈接,直到你點擊一個葉節點,其值大於根節點的右節點。

0

速度和內存大小總是折衷。

有數百個科學上不同的嘗試。 但所有這些額外的指針或列表等需要額外的內存。
這對於通用解決方案來說並不實用,當速度問題在大多數情況下不是樹時。
如果您需要一個非常特殊的樹,對於想要列出樹節點下的所有樹葉的特定應用程序,比您需要使用專門的實現,當您想要的東西比簡單地迭代左側和右側子樹我認爲這很合理。

還有誰想知道所有子節點的葉子?
這是樹的一個內部主題,從外部你甚至不應該知道節點下面是什麼。 (想想平衡的樹木,改變它們的結構)。