我有一個層次結構中的項目列表,我試圖將此列表解析爲實際的對象層次結構。我使用modified pre-order tree traversal來存儲/遍歷這個列表,所以我所擁有的是樹的一個子集,包括所有的孩子,都按他們的「左」值排序。從父/子的平面列表構建層次結構對象
例如,給定的樹:
- 項A
- 項目A.1
- 項目A.2
- 項目A.2.2
- B項
- 項目B.1
- C項
我得到的名單:
- 項目A,項目A.1,A.2項,項目A.2.2,項目B,項目B.1,項目C
(這是爲了來自修改的預訂樹設置的「左」值)。
我想要做的是分析到包含樹的實際結構對象,例如這樣的:
Class TreeObject {
String Name;
Guid ID;
Guid ParentID;
List<TreeObject> Children;
}
平列表返回TreeObjects的列表 - 每個的TreeObject具有屬性ID ,ParentID,Left和Right。我正在尋找的是一個功能:
List<TreeObject> FlatToHeirarchy(List<TreeObject> list);
它將扁平列表放入並返回一個嵌套列表。
換句話說:
List<TreeObject> flatSet = LoadTreeObjectsFromDatabase();
// flatSet.count == 7; flatSet(0).Children == null
List<TreeObject> nestedSet = FlatToHeirarchy(flatSet);
// nestedSet.count == 3; nestedSet(0).Children.count == 2
我不知如何做到這一點 - 跟蹤的父母,並能夠處理更大的跳躍(例如,項目A.2.2 - >項目B)。
編輯:我在尋找一個非強力解決方案在這裏(例如,不循環幾次,移動項目到子節點,直到只有頂級的父母左)。我猜測有一個優雅的方法可以循環一次,並根據需要放置物品。
請記住,它們始終處於分層次序(因爲我使用的是MPTT),所以給定的項目將始終是上一個項目的子項或同級項目,或者至少與之前的項目共享父項。它永遠不會到達樹中的其他地方。
給出的示例中,這是否意味着你存儲的parentId和左,右值在DB的每個節點? – 2011-09-05 20:47:49