2015-08-09 128 views
2

標題可能不是最清晰的。我爲此道歉。通過嵌套列表循環顯示爲列表

想象一下,我有一個評論列表。每條評論都可以擁有自己的評論列表(評論回覆),每條評論回覆都可以有自己的評論回覆列表等等。

它看起來有點像這樣:

Comment1: Wow, that's cool |-Comment1.1: No, it's not. You're stupid. |-|-Comment1.1.1: Why the flame? |-Comment1.2: Yeah, I agree! Comment2: I like horses |-Comment2.1: Offtopic. |-|-Comment2.1.1: Does it really matter?

它顯然是有要來一次親子之類的樹的事情。但是說我不知道​​每條評論有多少層次。我如何循環每個評論,就好像它是一個平面的一維數組?

+6

遞歸可能是一種方法。 – Tim

+0

哦,沒錯。我沒有想過遞歸! – hexagonest

回答

2

這個結構被稱爲樹,你問的是「走樹」。有很多方法可以做到這一點,遞歸是一個有趣的選擇。

你將不得不提供更多的信息,比如你會得到一個特定的答案之前,你有什麼數據結構存儲樹。

這一切歸結爲一組循環遍歷樹的每個分支中的所有孩子。

當您使用遞歸你寫一個遍歷當前節點的所有子功能,併爲每個孩子,你調用同一個函數來投奔它的孩子......

編輯:這裏是一個粗略的例子

void processNode(TreeNode t) 
{ 
    // Here print it out to print all nodes or add it to an 
    // ArrayList to just make a list, or whatever you please. 
} 

void walkTreeNode(TreeNode t) 
{ 
    processNode(t); 
    foreach (TreeNode child in t.getChildren()) 
     walkTreeNode(child); 
} 

現在,您只需將treeTreeNode與樹的根調用即可。

+0

謝謝你。我將嘗試編寫一個遞歸函數,基本上這樣: 1.循環遍歷數組 2.在數組內,檢查數組是否包含更多數組 3.如果是這樣,self(該數組) – hexagonest

+0

應該是簡單。該函數應該只處理當前節點,並在其每個子節點上調用「process」,然後重複該節點直到該節點沒有子節點。 – Cobusve

+0

那麼,我將如何使用這個遞歸函數來寫入一個新的函數呢?目前我已經得到了這個。 '的IEnumerable WalkTheTree (IEnumerable的 C) { 如果(c.Count()<1)返回新T [0]; IEnumerable final; IEnumerable final; foreach(IEnumerable c)中的項 //不是所有的代碼路徑都返回一個值。最終= WalkTheTree(item); } }' 編輯:https://gist.github.com/anonymous/4e89428fd8064e129dd5 – hexagonest