鉴于 JUNG 将树定义为有向图,因此将森林也定义为有向图当然是有意义的——有向图的联合是有向图。
这将您的问题减少到 Tree 是否应该扩展 DirectedGraph。树是图当然是有道理的:它们肯定有节点和边,你上面引用的定义将它们定义为特定类别的图。那么问题就变成了,树应该被引导吗?
考虑所有边都指向根的有向树(这些在联合查找算法中使用)或所有边都指向远离根的有向树通常是有意义的(搜索树就是一个例子)。但是,考虑无向树(例如无向图的生成树)也是有意义的。
对我来说有点令人惊讶(但不是“错误”),设计师选择指定所有树都是有向的,而没有指定边的方向和树结构之间的关系。也就是说,我认为简单地指定 Tree extends Graph 是合理的,并让特定的实例化进一步指定树是有向还是无向,或者我会选择一个约定(指向或远离根)并在 javadoc 中明确指定该约定。开发人员选择的解决方案强制 Tree 实现者指定其边缘的方向,以防止 Tree 用户使用该结构。例如,如果用户知道所有边都指向远离根的,他们可以通过从根开始并访问所有离开根的边来遍历图,但如果他们不知道他们必须考虑两个传入和出边。
由于 Java 的 instanceof 测试,实现没有方法的接口可能会产生后果。例如,图形绘制例程可以检查图形是否是有向图的实例,如果是,则绘制箭头而不是直线。
最后一点,在尝试理解图书馆中使用的术语时,我会在访问 Wikipedia 或任何其他来源时要小心,因为通常不同的人会为事物选择微妙的不同含义。例如,在某些库中,“Graph”实际上意味着“有向加权图”。你最好去javadoc。