簡體   English   中英

索引:使用數組/向量實現樹數據結構

[英]Indexing: Implementing Tree data structures with Arrays/Vectors

我一直在使用向量在C ++中實現堆。 由於必須輕松訪問節點的子節點(2n,2n + 1),因此必須從索引1開始。這是正確的方法嗎? 根據我的實現,始終在第零個位置存在一個虛擬元素。

您的方式有效。 另外,您可以在索引0處擁有root,在2n+12n+2處擁有孩子

盡管這對於堆很有效,但是最終您將為其他不一定具有完整完整的Binary樹的樹數據結構使用大量的冗余內存。 例如,這意味着如果您有一個20個深度為5的節點的二叉搜索樹,則最終必須使用2 ^ 5 = 32而不是20的數組。現在想象一下,如果您需要一個25個節點的樹深度為22。您最終將使用4194304的龐大數組,而您本可以使用鏈接表示形式來僅存儲25個節點。

您仍然可以使用數組,而不會產生此類內存不足。 只需將一個大內存塊分配為一個數組,並使用數組索引作為指向子代的指針。

因此,你在哪里

node.left = (node.index*2)
node.right = (node.index*2+1)

您只需使用

node.left = <index of left child>
node.right = <index of right child>

或者,如果您的語言支持,也可以只使用指針/引用而不是數組的整數索引。

編輯:

對於每個人來說,一個完整的二進制搜索樹占用O(2 ^ d)內存可能並不明顯。 有d個級別,每個級別的節點數是其父級所在級別的兩倍(因為除底部節點外的每個節點都恰好有兩個子節點-從來沒有一個)。 二進制堆是根據定義始終完整的二進制樹 (但不是二進制搜索樹),因此OP概述的基於數組的實現不會產生任何實際的內存開銷。 對於堆,這是在代碼中實現它的最佳方法。 OTOH,大多數其他二叉樹(尤其是二叉搜索樹)不能保證是完整的。 因此,嘗試在此方法上使用O(2 ^ depth)內存,其中深度可以與n一樣大,而在鏈接實現中,我們只需要O(n)內存。

所以我的答案是:是的,這是堆的最佳方法。 只是不要對其他二進制樹嘗試(除非您確定它們將始終是完整的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM