簡體   English   中英

從頭開始實現樹

[英]Implementing a tree from scratch

我試圖通過從頭開始實現一個來學習樹。 在這種情況下,我想用C#Java或C ++來做。 (不使用內置方法)

因此每個節點將存儲一個字符,每個節點最多有26個節點。

我將使用什么數據結構來包含指向每個節點的指針?

基本上我正在嘗試從頭開始實現基數樹。

謝謝,

我將使用什么數據結構來包含指向每個節點的指針?

一個節點。 每個節點都應該引用樹中的(最多)26個其他節點。 在Node中,您可以將它們存儲在數組,LinkedList,ArrayList或您可以想到的任何其他集合中。

這並不重要。 您可以使用鏈接列表,數組(但這將具有固定大小),或使用您的語言的標准庫中的列表類型。

使用List /數組意味着要進行一些索引簿記來遍歷樹,因此最簡單的方法是只使用對父項中子項的引用。

這是我最近發現的一個不是一個糟糕的樹API - 雖然我需要圖表,看看如何設置它來分離它所持有的數據的數據結構是很方便的,所以你可以有一個等價於Iterator的樹。瀏覽樹,等等。

https://jsfcompounds.dev.java.net/treeutils/site/apidocs/com/truchsess/util/package-summary.html

如果你實際上對速度比空間更感興趣,並且如果每個節點只代表一個字母(隱含最多26個),那么我只使用一個簡單的26個插槽陣列,每個插槽引用一個“節點”(節點是包含數組的對象)。

固定大小的數組的好處是你的查找速度會快得多。 如果你查找的char“c”已經保證是一個較低的套裝字母,那么查找就像下面這樣簡單:

nextNode=nodes[c-'a'];

對字符串的遞歸查找將是微不足道的。

你描述的不是基數樹......在基數樹,你可以在一個節點的多個字符,且有上子節點的數量沒有上限。

您所描述的內容聽起來更受限於字母...每個節點可以是az,后面可以跟另一個字母,az等。這種區別對於您選擇保存下一個節點指針的數據結構至關重要。

在您描述的樹中,最簡單的結構可能是一個簡單的指針數組......您需要做的就是將字符(例如'A')轉換為其ascii值('65'),然后減去起始值offset(65)確定你想要的“下一個節點”。 占用更多空間,但插入和遍歷非常快。

在真正的基數樹中,您可以有3個,4個,78個或0個子節點,並且“下一個節點”列表將具有排序,插入和刪除的開銷。 慢得多。

我不能說Java,但如果我在C#中實現自定義基數樹,我會使用其中一個內置的.NET集合。 編寫自己的排序列表並不能真正幫助您學習樹概念,並且.NET集合的內置優化很難實現。 然后,您的代碼很簡單:查找下一個節點; 如果存在,抓住它去; 如果沒有,請將其添加到下一個節點集合中。

您使用哪個集合取決於您通過樹實現的具體內容......每種類型的樹都需要在插入時間,查找時間等之間進行權衡。您所做的選擇取決於對應用程序最重要的是什么,而不是樹。

說得通?

感謝您的快速回復。

是的,snogfish說是正確的。 基本上,它的樹有26個節點(AZ)+一個bool是終結者。

每個節點都有這些值,它們相互鏈接。

我還沒有深入學習指針,所以今天我嘗試使用C#中的不安全代碼從頭開始實現這一點。

因此,如果有人能夠使用內部樹類為我提供開始使用C#的代碼,我將不勝感激。 一旦我開始它,我可以將算法移植到其他語言,只需將其更改為使用指針。

非常感謝,邁克爾

看看這個Simeon Pilgrim博客,“ Code Camp Puzzle評論 ”。 其中一個解決方案使用C#中的Radix,您可以下載解決方案。

暫無
暫無

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

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