使用 jgrapht 在 forset 中拆分一棵树
Split a tree in a forset using jgrapht
我有一棵用库 jgrapht 表示的树,有各种类型的节点,我需要从特定节点类型开始切割任何子树。
如您在此示例中所见,这棵树表示 Java class 的源代码。我需要通过从每个 "Entry" 节点类型开始拆分主树来创建多个 jgrapht 对象。我总共应该从这个大树上得到 7 棵树。我使用的结构是 DirectedPseudograph
.
虽然我不是100%清楚你想要什么,但似乎有多种解决方法。
- 从根节点的每个传出邻居开始,您可以运行深度优先搜索并记录返回的节点。 DFS算法可达的节点属于同一子树。为此,您可以使用 DepthFirstIterator
- 您可以创建没有根节点的子图,例如通过在生成的导出子图上使用 AsSubgraph class. You can then invoke the ConnectivityInspector。由于每个子树都是一个断开连接的图形组件,连接性检查器将能够找到这些组件中的每一个。
顺便说一句,除非您需要伪图的功能,否则为了提高性能,最好使用 SimpleDirectedGraph。显然,后者不允许平行边或自环。
我有一棵用库 jgrapht 表示的树,有各种类型的节点,我需要从特定节点类型开始切割任何子树。
如您在此示例中所见,这棵树表示 Java class 的源代码。我需要通过从每个 "Entry" 节点类型开始拆分主树来创建多个 jgrapht 对象。我总共应该从这个大树上得到 7 棵树。我使用的结构是 DirectedPseudograph
.
虽然我不是100%清楚你想要什么,但似乎有多种解决方法。
- 从根节点的每个传出邻居开始,您可以运行深度优先搜索并记录返回的节点。 DFS算法可达的节点属于同一子树。为此,您可以使用 DepthFirstIterator
- 您可以创建没有根节点的子图,例如通过在生成的导出子图上使用 AsSubgraph class. You can then invoke the ConnectivityInspector。由于每个子树都是一个断开连接的图形组件,连接性检查器将能够找到这些组件中的每一个。
顺便说一句,除非您需要伪图的功能,否则为了提高性能,最好使用 SimpleDirectedGraph。显然,后者不允许平行边或自环。