Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中使用节点列表的通用N元树(每个子级有两个以上节点的树)树遍历_Java_Algorithm_Generics_Tree_Iterator - Fatal编程技术网

Java中使用节点列表的通用N元树(每个子级有两个以上节点的树)树遍历

Java中使用节点列表的通用N元树(每个子级有两个以上节点的树)树遍历,java,algorithm,generics,tree,iterator,Java,Algorithm,Generics,Tree,Iterator,我一直在尝试在工作中实现Autosys作业计划的树表示。 由于每个作业(流程)可以有一个或多个依赖作业,因此我决定使用n元树实现,以便映射流程。我使用java集合来实现同样的目标 Q1(已解决):目前的问题是显示功能在无限循环中挂起。 我试图寻找现有的线程,但找不到使用迭代器进行遍历的示例 Q2:(打开)显示功能以后序方式遍历树。我希望以一种级别顺序的方式遍历它,其中节点以级别为基础进行打印。 根,然后是级别1上的所有节点,然后是级别2上的所有节点,依此类推。 DFS遍历的链接作为另一个问题发布

我一直在尝试在工作中实现Autosys作业计划的树表示。 由于每个作业(流程)可以有一个或多个依赖作业,因此我决定使用n元树实现,以便映射流程。我使用java集合来实现同样的目标

Q1(已解决):目前的问题是显示功能在无限循环中挂起。 我试图寻找现有的线程,但找不到使用迭代器进行遍历的示例

Q2:(打开)显示功能以后序方式遍历树。我希望以一种级别顺序的方式遍历它,其中节点以级别为基础进行打印。 根,然后是级别1上的所有节点,然后是级别2上的所有节点,依此类推。 DFS遍历的链接作为另一个问题发布在下面的链接中。 (大家好,我还有一个关于同一棵树的水平顺序遍历的问题,我已经在下面给出的链接上发布了这个问题。如果你们能帮忙,我将不胜感激。 让我们为通用树提供更多资源。)

我们能不能把这篇文章作为一篇有n元树的新手的足智多谋的文章,因为我发现基本的例子很少

这是我的代码,我从一个有三个子节点的根节点开始。我计划稍后扩展此功能

一个基本问题。不建议在递归中使用迭代器。我尝试在display()中定义一个迭代器,但仍然不起作用

当前树结构:

输出为后序(不确定这是否意味着DFS)

代码

import java.util.*;
导入java.io.*;
导入java.util.List;
//n元树的节点
公共类鸣笛树
{
//display函数遍历树
无效显示(奈米筛t)
{
迭代器IT=t.nary_list.Iterator();
if(!(IT.hasNext())//如果节点没有任何子节点,请输入。
{
//System.out.println(“此节点不再有子节点”);
系统输出打印(t.data+“”);
回来
}
while(IT.hasNext()){
display(IT.next());//递归调用
}
系统输出打印(t.data+“”);
}
公共静态void main(字符串参数[]){
NaryTree t1=新的NaryTree();
NaryTreeNode根=新的NaryTreeNode();
root.data=100;
NaryTreeNode lev_11=新的NaryTreeNode();lev_11.data=90;
NaryTreeNode lev_12=新的NaryTreeNode();lev_12.data=50;
NaryTreeNode lev_13=新的NaryTreeNode();lev_13.data=70;
NaryTreeNode lev_21=新的NaryTreeNode();lev_21.data=20;
NaryTreeNode lev_22=新的NaryTreeNode();lev_22.data=30;
NaryTreeNode lev_23=新的NaryTreeNode();lev_23.data=200;
NaryTreeNode lev_24=新的NaryTreeNode();lev_24.data=300;
//将所有节点添加到列表中。
List temp2=new ArrayList();//第二级第一个分支
temp2.add(lev_21);
temp2.add(lev_22);
List temp3=new ArrayList();//第二级分支
temp3.add(lev_23);
temp3.add(lev_24);
List temp=new ArrayList();//一级
温度添加(标高11);
温度添加(标高12);
温度添加(标高13);
lev_11.nary_list.addAll(临时2);
lev_12.nary_list.addAll(temp3);
//将Temp添加到根以形成根的叶
root.nary_list.addAll(临时);
//调用显示功能。
t1.显示(根);
}
}

在我看来,您每次通过循环都在创建一个新的迭代器,因此每个迭代器都设置在列表的开头。我稍后将尝试添加规范参考。尝试:

    Iterator<NsryTreeNode> i = t.nary_list.iterator();
    while(i.hasNext()){
        display(t.nary_list.iterator().next()) ;            //Recursive Call
    }
Iterator i=t.nary_list.Iterator();
while(i.hasNext()){
显示(t.nary_list.iterator().next());//递归调用
}

你可能想看看。您可能会发现ListIterator很有价值。

我对Java了解不够,无法理解该循环中可能发生的事情,但我觉得它很可疑;按照我的理解,每次循环中都会创建一个新的迭代器

<>我也建议您考虑使用第一个子节点/下一个兄弟姐妹,而不是在每个节点中放置一个列表。在此系统中,每个节点引用(最多)两个其他节点:其第一个子节点(如果有子节点)和下一个同级节点(除非它是其父节点的最后一个同级节点)。然后,您可以在同级列表中遍历同级列表以枚举子节点,而不会在每个节点中都产生可变长度数组的所有开销

nary_list.iterator()
每次创建一个新的迭代器。因此,如果列表中有任何内容,这将是一个无限循环;它每次运行时都会创建一个新的迭代器,并且始终包含元素:

while(t.nary_list.iterator().hasNext()){
如果要直接使用迭代器,可以执行以下操作:

Iterator<NaryTreeNode> iterator = t.nary_list.iterator();
while (iterator.hasNext()) {
编辑

我还将按此顺序编写display函数,以便在耗尽迭代器后打印当前节点的值,而不必询问
!hasNext()


这是如何编译的?您正试图将一个
列表
添加到另一个
列表
。我希望有例外!纠正我自己:这是一个
addAll
,因此是正确的。你不应该在你的问题中更改代码。这会让人困惑。只要接受有效的答案。如果您觉得有必要,请添加另一个带有更改的代码块。显式定义迭代器解决了此问题。现在,下一个问题是display函数,它不会以DFS或BFS方式显示节点。我是否为此打开一个新问题,或者是否可以编辑相同的问题。请告知。。。。他在
列表
(即“temp”)中添加了一个
列表
。我怀疑它是否能编译!至少在运行时它必须抛出一个异常?@Steven我之前试过这个(Iterator it=t.nary_list.Iterator();),但它仍然运行到一个无限循环中。@DonRoby OP给出的确切代码是什么?我不相信这一点,我很想用我所知道的关于Java泛型的所有知识来尝试一下。@Fil
nary_list.iterator()
while(t.nary_list.iterator().hasNext()){
Iterator<NaryTreeNode> iterator = t.nary_list.iterator();
while (iterator.hasNext()) {
for (NaryTreeNode node : t.nary_list) 
// Display all of my children
for (NaryTreeNode node : t.nary_list) {
    display(node);
}

// Display myself
System.out.println("Value is: " + t.data);