I
itse
Gast
Hallo Zusammen,
ein Binärbaum soll erzeugt werden, dieser enthält dann wieder Kinder (left und right) usw. Je nachdem wie man den Baum erzeugt.
Dies geschieht über addLeft und addRight. Eine Frage: Ist diese Methode so richtig? Es soll nicht berücksichtigt werden, ob bereits ein Objekt zugewiesen wurde.
Ich nun ein Problem beim Kopier-Konstruktor und der Ausgabe der beiden Bäume.
Problem Kopier-Konstruktor:
Es sind ja Referenzdatentypen, also reicht eine einfache Wertzuweisung nicht aus. Also wollte ich neue Objekte erzeugen, diese dann den Parameter übergeben. Jedoch erhalte ich immer eine NullPointer-Exception.
Wie kann man das realisieren, zur Unterscheidung, damit es neue unabhänige Objekte sind, soll beim Namen noch ein c_ angehängt werden.
Problem Ausgabe:
Bei dem Baum, so wie es bisherig erzeugt wurde, sollte folgendes rauskommen (Format: Knoten, left, right):
node1 node2 node3
node2 node4
node4 node7
node7
node3 node5 node6
node5
node6
Bei mir kommt aber:
node1 node2 node3
node2 node4
node4 node7
node7
node3 node2
node3 node5 node6
node5
node6 node5
node6
Und einen Knoten 3 mit Kind 2 gibt es ja gar nicht und auch Knoten 6 mit Kind 5 sollt es nicht geben.
Wo liegt da der Fehler? Geht es nicht auch einfacher?
Vielen Dank.
ein Binärbaum soll erzeugt werden, dieser enthält dann wieder Kinder (left und right) usw. Je nachdem wie man den Baum erzeugt.
Dies geschieht über addLeft und addRight. Eine Frage: Ist diese Methode so richtig? Es soll nicht berücksichtigt werden, ob bereits ein Objekt zugewiesen wurde.
Ich nun ein Problem beim Kopier-Konstruktor und der Ausgabe der beiden Bäume.
Problem Kopier-Konstruktor:
Es sind ja Referenzdatentypen, also reicht eine einfache Wertzuweisung nicht aus. Also wollte ich neue Objekte erzeugen, diese dann den Parameter übergeben. Jedoch erhalte ich immer eine NullPointer-Exception.
Wie kann man das realisieren, zur Unterscheidung, damit es neue unabhänige Objekte sind, soll beim Namen noch ein c_ angehängt werden.
Problem Ausgabe:
Bei dem Baum, so wie es bisherig erzeugt wurde, sollte folgendes rauskommen (Format: Knoten, left, right):
node1 node2 node3
node2 node4
node4 node7
node7
node3 node5 node6
node5
node6
Bei mir kommt aber:
node1 node2 node3
node2 node4
node4 node7
node7
node3 node2
node3 node5 node6
node5
node6 node5
node6
Und einen Knoten 3 mit Kind 2 gibt es ja gar nicht und auch Knoten 6 mit Kind 5 sollt es nicht geben.
Wo liegt da der Fehler? Geht es nicht auch einfacher?
Vielen Dank.
Java:
public class Node {
String name;
Node left;
Node right;
//Konstruktor
Node(String name) {
this.name = name;
this.left = null;
this.right = null;
}
//Kopier-Konstruktor, tiefe Kopie des aktuellen Knotens
//sammt aller Unterknoten
Node(Node node) {
this.left = new Node(node.left);
this.right = new Node(node.right);
this.name = "c_" + node.name;
}
//Rechtes Objekt zuweisen
public void addLeft(Node node) {
this.left = node;
}
//Linkes Objekt zuweisen
public void addRight(Node node) {
this.right = node;
}
// Ausgabe des kompletten Baums, beginnend mit dem aufrufenden Node-Objekte
public void output() {
if (this.name == null)
return;
if (this.name != null) {
System.out.print(this.name + " ");
if (this.left != null) {
System.out.print(this.left.name + " ");
if (this.right != null)
System.out.print(this.right.name + " ");
System.out.println();
this.left.output();
}
if (this.right != null) {
System.out.print(this.right.name + " ");
if (this.left != null)
System.out.print(this.left.name + " ");
System.out.println();
this.right.output();
}
System.out.println();
}
}
public static void main(String[] args) {
// Initialisierung Knoten
Node node1 = new Node("node1");
Node node2 = new Node("node2");
Node node3 = new Node("node3");
Node node4 = new Node("node4");
Node node5 = new Node("node5");
Node node6 = new Node("node6");
Node node7 = new Node("node7");
// Beispiel Binärbaum
node1.addLeft(node2);
node1.addRight(node3);
node2.addLeft(node4);
node3.addLeft(node5);
node3.addRight(node6);
node4.addLeft(node7);
// Erstelle tiefe Kopie des ersten Objekts des Baums
Node node = new Node(node1);
// Test und Ausgabe der Tiefen Kopie
System.out.printf("%-13s %n", "Tiefe Kopie:");
node.output();
System.out.println();
// Test und Ausgabe des Originals
System.out.printf("%-13s %n", "Original:");
node1.output();
System.out.println();
}
}