通过对象树的有效方式?

时间:2009-06-25 15:17:00

标签: java algorithm search

我有一组TreeNodes,每个TreeNodes都有一个id,一个父节点集合和一个子节点集合。

对于给定的节点Id,我正在寻找一种有效的方法来生成通过该节点的所有链接。简而言之,从节点开始,遍历其所有子节点。如果节点有多个子节点,请为每个子节点创建一个链接。遍历孩子等。

我也希望能够通过父节点在“向上”方向上做到这一点。

有一个简单的算法可以做到吗?

编辑:哦,我希望能够输出给定链中所有节点的id ...

3 个答案:

答案 0 :(得分:3)

您正在寻找Breadth FirstDepth First Search。首先它不超过以下(这是深度优先搜索)。

Visit(Node node)
{
    foreach (Node childNode in node.Children)
    {
        Visit(childNode);
    }

    DoStuff(node);
}

问题是图形可能包含循环,因此算法将进入无限循环。要解决这个问题,您必须记住访问过的节点,或者将它们存储在集合中。如果图形没有周期 - 例如,如果它是一棵树 - 这个简短的算法已经可以工作了。

顺便说一下,如果TreeNode有多个父节点,那么它不是树而是图形节点。

答案 1 :(得分:0)

好吧,如果节点有对父节点的引用,那么递归获取父节点很简单(一旦在树中,每个节点只有一个节点(或者根本没有节点,如果它是根节点)父节点。

如果没有这样的引用,那么你可以使用广度优先搜索,例如,初始设置父节点集合。

- 编辑 -

一旦节点可能有多个父节点,那么您正在处理图形。还有graph traversal algorithms(参见旁边的表格)。

确保,如果你的图表有一个循环,你将不会有一个无限循环

答案 2 :(得分:0)

您可能希望在depthFirstEnumeration()上查看breadthFirstEnumeration()DefaultMutableTreeNode。但是,这并不能解决您想要以自下而上的方式导航树的问题。