【发布时间】:2015-10-08 17:13:24
【问题描述】:
|-- Car |-- Green
| |-- Audi | |-- Car
| | |-- Green | | `-- Audi
| | |-- Blue | `-- Bike
| | `-- Red | `-- BMW
| `-- BMW |-- Blue
| |-- Red | `-- Car
| `-- Yellow ==========> | `-- Audi ==========> etc.
`-- Bike |-- Red
|-- BMW | |-- Car
| |-- Yellow | | |-- Audi
| |-- Blue | | `-- BMW
| `-- Green | `-- Bike
`-- Honda | `-- Honda
|-- Red `-- Yellow
`-- Yellow |-- Car
| `-- BMW
`-- Bike
|-- BMW
`-- Honda
我想以通用方式在树构建器中实现几个“透视图”。
这棵树有 6 种可能的排列,我只画了其中的 2 种。
我尝试了什么:
- 我使用的是通用树结构,其中每个节点都知道它的父节点和子节点,并且都有一个有效负载。
- 类:
TreeBuilder、AbstractNode、VehicleNode、ColorNode、MakerNode,以及另一个定义级别顺序的枚举有序列表:BY_VEHICLE、BY_COLOR、BY_MAKER- 你可以切换这些以获得所需的视角 - 遍历枚举列表,将所有特定于该枚举值的实体(汽车、制造商、颜色)收集为对象左右。使用工厂方法,使用
enumValue创建节点,同时传递树构建器和parentEnumValue(对于顶级,父枚举值为 NULL)。 - 子级有一个
getParentMember_Internal,它根据parentEnumValue获取正确的父级(通过使用包含所有数据映射的treeBuilder) - 在我提到的上一个迭代中,使用结果节点的父对象,我们可以搜索树并查看它是哪个节点(请记住,级别是自上而下创建的,因此父对象已经存在)
为什么它不起作用:
- 在搜索正确的父级时,树中可能有多个实例,因此我们不得不同时查看祖父级。
- 此外,分支可能会重复(参见第二棵树)
我在问什么:
- 这种树/算法是否有特定的命名?我想不出可以在 Google 中使用的英文术语。
- 它与“K-D 树”有什么关系吗?
- 有没有通用的方法来做这种事情?
编辑 1 @Andreas
树中只有 3 个可能的实体:Vehicle、Color、Maker。没有“车型”。树中的所有有效载荷都是这三个的子类。
我称它们为“有效负载”,因为每个对象都包装在 AbstractNode 子类(它是树结构的一部分)中,以将数据与表示层分开。示例:VehicleNode has a Vehicle payload。
由于实体彼此独立,因此可以隐藏关卡。 这将是一个有效的案例:
|-- Green
| |-- Audi
| `-- BMW
|-- Blue
| `-- Audi
|-- Red
| |-- Audi
| |-- BMW
| `-- Honda
`-- Yellow
|-- BMW (notice this doesn't appear twice under 'yellow', like in the second tree above)
`-- Honda
【问题讨论】:
-
我会尝试使用堆栈并用 preorder、postorder 和 Breathfirst 迭代来提供它?只是快速的想法....嗯,但这也许不能解决您在“为什么它不起作用”中提到的问题
-
您正在受苦,因为您试图将数据存储在树结构中,而实际上您的数据项之间并没有以这种方式相互关联。我建议您将(车辆、颜色、制造商)三元组彼此不相关地存储,然后从那里构建您的树,而不是尝试将一棵树转换为另一棵树。