我有一个层次结构中的项目列表,我正在尝试将此列表解析为实际的对象层次结构。我正在使用修改后的预排序树遍历来存储/遍历这个列表,所以我拥有的是树的一个子集,包括所有子节点,按它们的“左”值排序。
例如,给定树:
- 项目 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;
}
平面列表作为 TreeObject 列表返回 - 每个 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),因此给定的项目将始终是前一个项目的子项或兄弟姐妹,或者至少与前一个项目共享一个父项。它永远不会出现在树的其他地方。