我有一组TreeNodes,每个TreeNodes都有一个id,一个父节点集合和一个子节点集合。
对于给定的节点Id,我正在寻找一种有效的方法来生成通过该节点的所有链接。简而言之,从节点开始,遍历其所有子节点。如果节点有多个子节点,请为每个子节点创建一个链接。遍历孩子等。
我也希望能够通过父节点在“向上”方向上做到这一点。
有一个简单的算法可以做到吗?
编辑:哦,我希望能够输出给定链中所有节点的id ...
答案 0 :(得分:3)
您正在寻找Breadth First或Depth 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
。但是,这并不能解决您想要以自下而上的方式导航树的问题。