【发布时间】:2012-10-06 19:55:24
【问题描述】:
我一直在尝试实现 Autosys 工作计划的树形表示。 由于每个作业(流程)都可以有一个或多个相关作业,因此我决定使用 n-ary tree 实现,以便我可以映射流程。我也在使用 java 集合。
Q1(已解决):目前的问题是显示功能陷入无限循环。 我尝试查找现有线程,但找不到使用迭代器进行遍历的示例。
Q2:(OPEN)显示函数以Post order方式遍历树。我想以级别顺序方式遍历它,其中节点在级别基础上打印。 根,然后是一级的所有节点,然后是二级的所有节点,依此类推。 DFS 遍历的链接作为另一个问题发布在下面的链接中。 (大家好,我对同一棵树的级别顺序遍历还有另一个问题,我已经在下面给出的链接上发布了这个问题。如果你们能提供帮助,我会很高兴。 Level Order traversal of a generic tree(n-ary tree) in java 让我们为通用树提供更多资源。)
我们能否为刚接触 n 叉树的人提供一个资源丰富的帖子,因为我发现的基本示例很少。
这是我的代码,我从一个具有三个孩子的根节点开始。我计划稍后扩展它。
一个基本问题。不建议在递归中使用迭代器。我尝试在 display() 中单独定义一个迭代器,但它仍然不起作用。
当前树结构:
root(100) / | \ 90 50 70 / \ 20 30 200 300
输出是后序的(不确定这是否意味着 DFS)。
20 30 90 200 300 50 70 100
代码
import java.util.*;
import java.io.*;
import java.util.List;
//The node for the n-ary tree
public class NaryTree
{
//The display function traverses the tree
void display(NaryTreeNode t)
{
Iterator<NaryTreeNode> IT = t.nary_list.iterator();
if(!(IT.hasNext())) //If the node does not have any children, enter.
{
// System.out.println("No more childs of this node");
System.out.print( t.data + " ");
return;
}
while(IT.hasNext()){
display(IT.next()) ; //Recursive Call
}
System.out.print(t.data + " ");
}
public static void main(String args[]){
NaryTree t1 = new NaryTree();
NaryTreeNode root = new NaryTreeNode();
root.data = 100;
NaryTreeNode lev_11 = new NaryTreeNode(); lev_11.data=90;
NaryTreeNode lev_12 = new NaryTreeNode(); lev_12.data=50;
NaryTreeNode lev_13 = new NaryTreeNode(); lev_13.data=70;
NaryTreeNode lev_21 = new NaryTreeNode(); lev_21.data=20;
NaryTreeNode lev_22 = new NaryTreeNode(); lev_22.data=30;
NaryTreeNode lev_23 = new NaryTreeNode(); lev_23.data=200;
NaryTreeNode lev_24 = new NaryTreeNode(); lev_24.data=300;
//Add all the nodes to a list.
List<NaryTreeNode> temp2 = new ArrayList<NaryTreeNode>(); //Level two first branch
temp2.add(lev_21);
temp2.add(lev_22);
List<NaryTreeNode> temp3 = new ArrayList<NaryTreeNode>(); //level two second branch
temp3.add(lev_23);
temp3.add(lev_24);
List<NaryTreeNode> temp = new ArrayList<NaryTreeNode>(); //level one
temp.add(lev_11);
temp.add(lev_12);
temp.add(lev_13);
lev_11.nary_list.addAll(temp2);
lev_12.nary_list.addAll(temp3);
//Add Temp to root to form a leaf of the root
root.nary_list.addAll(temp);
//Call the display function.
t1.display(root);
} }
【问题讨论】:
-
这个怎么编译?您正在尝试将
List<NaryTreeNode>添加到另一个List<NaryTreeNode>。我希望会有一些例外! -
纠正自己:这是
addAll,因此正确。 -
您不应更改问题中的代码。会让人们感到困惑。只需接受有效的答案。如果您觉得有必要,请添加另一个代码块进行更改。
-
显式定义一个迭代器解决了这个问题。
-
现在下一个问题是显示功能,它不是以DFS或BFS方式显示节点。我是否为此打开一个新问题,或者我可以编辑相同的问题。请指教。
标签: java algorithm generics tree iterator