2009-06-25 68 views
1

我有一组TreeNodes,每个TreeNode都有一个id,一组父节点和一组子节点。有效的方法来遍历对象树?

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

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

有没有一个简单的算法来做到这一点?

编辑:哦,我想能够输出在给定链中的所有节点的ID的...

+0

您能解释一下您'通过该节点的链接'是什么意思吗? – akarnokd 2009-06-25 15:31:45

+0

他/她可能指的是路径。 Visage: 图结构是相当静态的还是高度易变的? 您是否在寻找时间或空间效率? – alphazero 2009-06-25 16:38:05

回答

3

你正在寻找一个Breadth FirstDepth First Search。起初它不超过以下内容(这是深度优先搜索)。

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

    DoStuff(node); 
} 

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

顺便说一句,如果TreeNode有多个父节点,它不是一棵树,而是一个图节点。

0

嘛,如果节点对其父的引用,它的简单如果没有这样的引用,比你可以使用宽度优先的搜索,为了获得父节点(一旦在树中,每个节点只有一个(或根本没有,如果它是一个根目录的话)parent。

例如,初始设置您的父节点集合。

- 编辑 -

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

确保,如果你的图有一个周期,你会不会落得具有无限循环

0

你可能想看看depthFirstEnumeration()breadthFirstEnumeration()DefaultMutableTreeNode。然而,这并不能解决你想以自下而上的方式浏览树的问题。