3 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
我最好的建議是沒(méi)有標(biāo)準(zhǔn)的樹(shù)數(shù)據(jù)結(jié)構(gòu),因?yàn)橛泻芏喾椒梢詫?shí)現(xiàn)它,用一個(gè)解決方案覆蓋所有基礎(chǔ)是不可能的。解決方案越具體,它就越不可能適用于任何給定的問(wèn)題。我甚至對(duì)LinkedList感到惱火 - 如果我想要一個(gè)循環(huán)鏈表怎么辦?
您需要實(shí)現(xiàn)的基本結(jié)構(gòu)將是一組節(jié)點(diǎn),這里有一些選項(xiàng)可以幫助您入門(mén)。我們假設(shè)類(lèi)Node是整個(gè)解決方案的基類(lèi)。
如果只需要向下導(dǎo)航樹(shù),那么Node類(lèi)需要一個(gè)子列表。
如果需要向上導(dǎo)航樹(shù),則Node類(lèi)需要指向其父節(jié)點(diǎn)的鏈接。
構(gòu)建一個(gè)AddChild方法,負(fù)責(zé)處理這兩點(diǎn)的所有細(xì)節(jié)以及必須實(shí)現(xiàn)的任何其他業(yè)務(wù)邏輯(子限制,對(duì)子項(xiàng)進(jìn)行排序等)

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
delegate void TreeVisitor<T>(T nodeData);class NTree<T>{ private T data; private LinkedList<NTree<T>> children; public NTree(T data) { this.data = data; children = new LinkedList<NTree<T>>(); } public void AddChild(T data) { children.AddFirst(new NTree<T>(data)); } public NTree<T> GetChild(int i) { foreach (NTree<T> n in children) if (--i == 0) return n; return null; } public void Traverse(NTree<T> node, TreeVisitor<T> visitor) { visitor(node.data); foreach (NTree<T> kid in node.children) Traverse(kid, visitor); }}
簡(jiǎn)單的遞歸實(shí)現(xiàn)...... <40行代碼...你只需要保持對(duì)類(lèi)外部樹(shù)的根的引用,或者將它包裝在另一個(gè)類(lèi)中,也許重命名為T(mén)reeNode?
- 3 回答
- 0 關(guān)注
- 562 瀏覽
添加回答
舉報(bào)