我有一个嵌套层级的项列表,并尝试将此列表解析为实际对象层次结构。我正在使用修改过的先序树遍历来存储/遍历此列表,因此我拥有包括所有子节点按其"left"值排序的子集树。
例如,给定以下树:
- Item A
- Item A.1
- Item A.2
- Item A.2.2
- Item B
- Item B.1
- Item C
我得到以下列表:
- Item A, Item A.1, Item A.2, Item A.2.2, Item B, Item B.1, Item C
(这是按照已修改的先序树设置中的"left"值顺序排列的)。
我想做的是将其解析为包含树的实际结构的对象,例如:
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
我不知道如何处理这个问题——如何跟踪父级,并能够处理更大的跳跃(例如,Item A.2.2 -> Item B)。
编辑:我在寻找一种非暴力解决方案(例如,不重复循环几次,将项目移动到子节点中,直到只剩下顶级父项)。我猜想有一种优雅的方法可以循环一次,并根据需要放置项目。
请记住,它们总是按层次顺序排列的(因为我在使用MPTT),因此给定的项目将始终是前一个项目的子项或同级项,或者至少与前一个项目共享父级。它永远不会出现在树的其他位置。