Hilfe zu Java LinkedTree - Java

Ich versuche, einen verknüpften Baum zu implementieren, erhalte jedoch eine Nullpointer-Ausnahme, wenn ich ihn ausführen. Kannst du mir helfen, das Problem zu beheben?

Ausnahme im Thread "main" java.lang.NullPointerException bei assign2Trees.LinkedTree.size (LinkedTree.java:16) bei assign2Trees.LinkedTree.main (LinkedTree.java:80)
import java.util.Iterator;
import java.util.NoSuchElementException;

public class LinkedTree<E> implements Tree<E>{

private Node<E> root;

public LinkedTree()
{
super();
}
public int size()
{
return root.getChildren().size() + 1;
}
public boolean isEmpty()
{
if(root == null)
return true;
else
return false;
}
public Iterator<E> iterator()
{
return new Iterator<E>()
{
private int i = 0;

public boolean hasNext()
{
return i < LinkedTree.this.size();
}
public E next() throws NoSuchElementException
{
if (!hasNext())
{
return null;
}
return (E) LinkedTree.this.root.getChildren().get(i++);
}
public void remove()
{

}
};
}
public E replace(E oldE, E newE)
{
int i = root.getChildren().indexOf(oldE);
root.getChildren().add(i, (Node<E>) newE);
return newE;
}
public E root() throws EmptyTreeException
{
if (isEmpty())
throw new EmptyTreeException ();
return this.root();
}
public E parent(E node)
{
return (E) ((Node<E>) root.getChildren()).getParent((root.getChildren().get(root.getChildren().indexOf(node))));
}
public Iterable<E> children(E node)
{
return (Iterable<E>) root.getChildren().listIterator();
}
public void delete(E node) throws RootNonDeletableException
{
if (node == null)
throw new RootNonDeletableException();
else
root.getChildren().remove(root.getChildren().indexOf(node));
}

public static void main(String[] args)
{
LinkedTree<Node<String>> tree = new LinkedTree<Node<String>>();
System.out.println(tree.size());

}


}


import java.util.ArrayList;
import java.util.List;

public class Node<E>{

protected E contents;
protected List<Node<E>> children;
protected Node<E> parent;

public Node()
{
super();
}
public Node(E contents)
{
this.setContents(contents);
}
public List<Node<E>> getChildren()
{
if(this.children == null)
{
return new ArrayList<Node<E>>();
}
return this.children;
}
public void setChildren(List<Node<E>> children)
{
this.children = children;
}
public void addChild(Node<E> child)
{
if (children == null)
{
children = new ArrayList<Node<E>>();
}
children.add(child);
}
public E getContents()
{
return this.contents;
}
public void setContents(E contents)
{
this.contents = contents;
}
public Node<E> getParent(Node<E> node)
{
return node.parent;
}
public void setParent(Node<E> parent, Node<E> child)
{
child.parent = parent;
}
}

Antworten:

2 für die Antwort № 1

root ist Null. Sie initialisieren nicht root zu irgendetwas oder zu überprüfen, dass es nicht null ist, bevor auf diese Zeile zugegriffen wird:

return root.getChildren().size() + 1;

Vielleicht:

return (root == null) ? 0 : root.getChildren().size()+1;

Es ist also wahrscheinlicher, dass das, was Sie wirklich tun sollten, festgelegt ist root Zu einem brandneuen Knoten in Ihrem Konstruktor sagen Sie:

public LinkedTree()
{
super();
root = new Node<E>();
}

Sie haben auch einen Fehler mit Ihrem root() Funktion:

public E root() throws Exception
{
if (isEmpty())
throw new Exception ();
return this.root();
}

Wird sich selbst nennen. Vielleicht meintest du es

public E root() throws Exception
{
if (isEmpty())
throw new Exception ();
return this.root;
}

Wenn Sie nun Ihren Baum in Ihrer Hauptmethode erstellen möchten, können Sie Folgendes tun:

tree.root().addChild(new Node<String>("test"));

Was dies tut, ist die Wurzel des Baumes zu bekommen, und fügt dann ein Kind hinzu.

Angenommen, Sie möchten eine komplizierte Struktur hinzufügen, beispielsweise einen Knoten mit einem Kind, könnten Sie Folgendes tun:

Node<String> deepest = new Node<String>("deepest node");
Node<String> deeper  = new Node<String>("deeper node");
deeper.addChild(deepest);
tree.root().addChild(deeper);

Dadurch erhalten Sie einen Baum mit Struktur:

[root] + - [deeper] + - am tiefsten

0 für die Antwort № 2

Veränderung

public List<Node<E>> getChildren()
{
if(this.children == null)
{
return new ArrayList<Node<E>>();
}
return this.children;
}

zu

public List<Node<E>> getChildren()
{
if(this.children == null)
{
return this.children = new ArrayList<Node<E>>(); // set the this.children field and return.
}
return this.children;
}

Sag mir wie das geht.


0 für die Antwort № 3

Der Wurzelknoten wird nie initialisiert, daher versuchen Sie, getChildren () für ein Objekt aufzurufen, das nicht vorhanden ist.