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

由Java中的ArrayList构造N进制树

侯令雪
2023-03-14

我试图从一个ArrayList中构造N元树,N元树表示为带有子指针和兄弟指针的二进制。这里是类节点,每个节点元素携带的数据应该通过预购遍历打印出来。

public class Node {


    public String data;
    public int ID,parentID;

    public Node child,sibling;  



    public Node(){}

    public Node(String data,int ID,int parentID)
    {
        this.data = data;
        this.ID = ID;
        this.parentID = parentID;

    }   

}

这是类树。

public class NTree
{
    public Node root;

    public NTree(){}    
    public void addTreeNode(Node parent, Node newChild)
    {

        if(parent.child == null)
         {
            parent.child = newChild;            
            return;
         }

        Node temp = parent.child;

        while(temp.sibling != null)
        {
            temp = temp.sibling;
        }
        temp.sibling = newChild;        

    }


    public Node find_parentNode(ArrayList<Node> nodes ,int parentID)
    {
        for(int i= 0;i<nodes.size();i++)
        {
            if(nodes.get(i).parentID == parentID)
                return nodes.get(i);
        }

        return null;
    }

    public  void preorder(Node root)
    {

           if (root == null) return;

             System.out.println(root.data);
             preorder(root.child);          
             preorder(root.sibling);

    }

在主程序中,我将根设置为一个parentID为0的节点,并且节点的数组列表是好的。为了添加树节点,我必须有哪个是父节点和哪个是新节点。当调用preorder函数时,它在:preorder(root.child);我认为这棵树的创建存在一些问题。有什么想法吗?

for(int i = 0; i < list_nodes.size(); i++)
{                                                                   
      Node parent = tree.find_parentNode(list_nodes, list_nodes.get(i).parentID);                                       
      tree.addTreeNode(parent, list_nodes.get(i));              
}
tree.preorder(tree.root);



. ComException in thread "main" java.lang.StackOverflowError
    at java.io.FileOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.flush(Unknown Source)
    at java.io.PrintStream.write(Unknown Source)
    at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
    at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source)
    at java.io.OutputStreamWriter.flushBuffer(Unknown Source)
    at java.io.PrintStream.write(Unknown Source)
    at java.io.PrintStream.print(Unknown Source)
    at java.io.PrintStream.println(Unknown Source)
    at solution.NTree.preorder(NTree.java:77)
    at solution.NTree.preorder(NTree.java:78)

共有1个答案

常雪风
2023-03-14

在addTreeNode和find_parentNode方法中做了一些小修改。请尝试以下操作:

public void addTreeNode(Node parent, Node newChild)
{

    if(parent==null){
        return;
    }
    if(parent.child == null)
     {
        parent.child = newChild;            
        return;
     }

    Node temp = parent.child;

    while(temp.sibling != null)
    {
        temp = temp.sibling;
    }
    temp.sibling = newChild;        

}


public Node find_parentNode(ArrayList<Node> nodes ,int parentID)
{
    for(int i= 0;i<nodes.size();i++)
    {
        if(nodes.get(i).ID == parentID)
            return nodes.get(i);
    }

    return null;
}

在main method中,下面是用例:

    NTree tree = new NTree();
    tree.root = new Node("A", 1, 0);
    ArrayList<Node> list_nodes = new ArrayList<Node>();
    list_nodes.add(tree.root);
    list_nodes.add(new Node("B", 2, 1));
    list_nodes.add(new Node("C", 3, 1));
    list_nodes.add(new Node("D", 4, 1));
    list_nodes.add(new Node("E", 5, 3));
    list_nodes.add(new Node("F", 6, 3));

    for (int i = 0; i < list_nodes.size(); i++) {
        Node parent = tree.find_parentNode(list_nodes, list_nodes.get(i).parentID);
        tree.addTreeNode(parent, list_nodes.get(i));
    }
    tree.preorder(tree.root);   
 类似资料:
  • 本文向大家介绍由ArrayList来深入理解Java中的fail-fast机制,包括了由ArrayList来深入理解Java中的fail-fast机制的使用技巧和注意事项,需要的朋友参考一下 1. fail-fast简介 “快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。某个线程在对collection进行迭代时,不允许其他线程对该collection进行结构上的修改。 例

  • 问题内容: 如果未将ArrayList初始化为字段,则将项目添加到ArrayList时出现NullPointerException。谁能解释为什么? 当我将ArrayList初始化为字段时起作用: 当我将ArrayList声明为字段然后在Class构造函数中对其进行初始化时,它不起作用: 问题答案: 因为构造函数中的版本正在创建一个新变量,而该变量恰好与您的成员字段名称相同,而成员字段仍未设置。这

  • 大家好,我正在学习Java中的构造函数链接,我有一些问题。。。 > 首先,有人能解释一下我什么时候需要使用这个吗?我真的想不出一个情况。 在这个例子中,在没有参数的构造函数中,我调用了另一个构造函数。我如何访问这个新的“詹姆斯·邦德”对象以备将来使用?

  • “Bericht”对象的单独类文件的一部分(荷兰语表示消息,包含一个字符串和两个日期): 在我的主方法的某个地方,我从这个类中创建新对象: 方法“printberichten”迭代数组列表并打印所有消息 getBericht getter方法: 因此,如果我创建一个新对象,我之前的所有对象都应该显示在text Area中,但我似乎只创建了我的类的一个实例。 在命令“lijst.add(this)”

  • 问题内容: 我是regex的新手,我正在尝试验证用户输入的字段是否以逗号分隔的格式输入周末,并且该日使用2个字符的缩写。我开发了以下无法正常运行的模式: ^(fr | sa | su | mo | tu | we | th)?(?(1)(,fr |,sa |,su |,mo |,tu |,we |,th)){0,5} $ 此模式成功匹配所需的输入,如下所示: fr 莫 fr,sa fr,tu su

  • 问题内容: 我的尺寸为10。我将其分配l1给新列表引用类型。威尔和指向同一个对象吗?还是分配给对象的副本l2? 使用引用时,如果我更新列表对象,它也会反映l1引用类型中的更改。 例如: 除了创建2个列表对象并在集合上进行从旧到新的复制之外,没有其他方法可以将列表对象的副本分配给新的引用变量吗? 问题答案: 是的,分配将刚刚复制值的(这是引用)。它们都将引用相同的对象。 但是,创建浅表副本非常简单: