2013-04-10 52 views
0

我有一個內存樹結構,類似於一個目錄樹。即:每個節點都有一個名爲子節點的字典。我想要一個從列表或數組名稱遍歷樹的有效方法。C#高效樹參數遞歸,高效的子數組或子列表

如果我從根節點開始,帶有我想要遍歷的子節點列表,{「有機體」,「靈長類動物」,「人類」,「男性」,「約翰史密斯」},我遞歸地處理一個步驟並傳遞剩餘的子列表到子節點,返回this.subNodes [myList [0]]。GetSubNode(myList.GetRange(1,myList.Count-1))...即使List.GetRange()是淺複製,它仍然會爲每個遞歸級別創建一個新列表。整個行動似乎非常時間和空間效率低下。

或者如果我嘗試使用一個數組,那麼創建一個子數組的最佳方法是Array.Copy,它也是一個淺拷貝。同樣的問題。

我想在C語言中,列表的頭部只是指向另一個指向另一個對象的對象的指針,因此獲取子列表就像跟隨一個指針一樣簡單。或者一個數組只是指向某個內存的指針,因此獲取子數組就像增加指針一樣簡單。非常節省時間和空間。有沒有辦法在C#中做到這一點?

目前,在C#中,我想我只需要忘記遞歸和從頂層做一些重複的......

或者,我可以遞歸傳遞未修改的數組作爲參數,還有一個int索引,我將在每個級別更深處增加。這很好,除了我需要傳遞另一個參數給遞歸方法調用,其唯一目的是與第n個遞歸方法調用進行通信,「忽略數組中的前n項」...這很好,如果這是唯一可能的解決方案(或最佳解決方案),那看起來很愚蠢。

有沒有更好的方法?

回答

1

.net中有一個LinkedList implementation,它允許您將下一個LinkedListNode傳遞給方法。

除此之外,索引的方法也很好 - 至少它不會消耗額外的內存。

還有一種方法可以像在C中一樣傳遞指向數組元素的指針。但這會迫使您在不安全模式下編譯程序,這通常是不可取的。

+0

呵呵。除了List類之外,我不知道有一個LinkedList類。就目前而言,這個答案絕對有效,謝謝。但在將其標記爲答案之前,我會等一會兒,看看是否有其他人建議創建子列表或子數組的任何好方法。 – 2013-04-10 23:14:54