当前位置: 首页 > 知识库问答 >
问题:

泛型N进制树(每个子节点超过两个节点的树)在Java中使用List进行树遍历

扈沛
2023-03-14

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

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

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

我们能不能把这篇文章作为一篇有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);

###

共有3个答案

后阳炎
2023-03-14

在我看来,每次循环都要创建一个新的迭代器,所以每个迭代器都设置为列表的开头。稍后我将尝试添加规范引用。尝试:

    Iterator<NsryTreeNode> i = t.nary_list.iterator();
    while(i.hasNext()){
        display(t.nary_list.iterator().next()) ;            //Recursive Call
    }

你可能想看看http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html。您可能会发现ListIterator具有值。

勾学博
2023-03-14

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

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

夔庆
2023-03-14
nary_list.iterator()

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

while(t.nary_list.iterator().hasNext()){

如果要直接使用迭代器,可以执行以下操作:

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

但是,您也可以在Java中使用for each循环来减少冗长:

for (NaryTreeNode node : t.nary_list) 

编辑

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

// Display all of my children
for (NaryTreeNode node : t.nary_list) {
    display(node);
}

// Display myself
System.out.println("Value is: " + t.data);
 类似资料:
  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 我遇到了这个问题,似乎在任何地方都找不到解决办法。 给定一个二叉树,其中每个节点都包含一个数字,表示其子树中剩余节点的数量,编写一个函数,返回第n个按顺序遍历的节点。 查找按序遍历的第n个节点相当简单,但如何使用关于左节点数的信息来改进该过程?

  • 我最近正在评估图形数据库或任何其他数据库的一个特定要求: 通过一个查询中节点的直接子节点及其所有直接和间接子节点的聚合属性检索每个节点的前n个子节点的能力。结果应返回正确的层次结构。 实例 < code >每个节点都有一个属性,即它有多少个直接子节点。并且该树不超过8层。假设我想运行整个树的查询,通过每个级别的所有节点,它的前2个子节点有最多的直接和间接子节点。它将为我们提供以下信息: 我想知道是

  • 我正在用python处理树,这就是我试图解决的问题。 我所有的节点都有列表。对于每个父母,通过一次删除一个元素,从父母列表中提取孩子的列表。 假设node1是列表1[1,2,3],我希望node1有3个子项(在本例中),其中每个子项都是通过每次删除一个项从列表1中提取的列表。所以node2=[2,3]node3=[1,3]和node4=[1,2] 我正在使用anytree库,但在复杂节点上找不到足

  • (为了避免冗长的解释,我所要寻找的只是java中泛型树(n元树)的级别顺序遍历。提供的代码正常工作,需要级别顺序显示功能。环顾四周一个小时,但找不到通用n元树的参考。如果soemone能帮助我在代码上构建LevelOrderDisplay函数,我将不胜感激,因为它将帮助我理解我遇到的队列错误。谢谢 我一直在尝试在工作中实现Autosys作业计划的树表示。由于每个作业(流程)可以有一个或多个依赖作业

  • 这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问