Binärbaum

Status
Nicht offen für weitere Antworten.
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.


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();

    }
}
 

Civilazi

Bekanntes Mitglied
Nur ganz kurz, da keine Zeit mehr:

Der Copyconstructor ruft sich immer wieder selbst auf und wandert am linken Ast in den Baum, bis er irgendwann bei nem Blatt ist. Da ist node.left == null. Aber dein Konstruktor will weitermachen, also:
new Node(null.left) und schon hast du deine NPE :)

Die Ausgabe hab ich mir nicht angeguckt.
 
I

itse

Gast
Danke hat mich schon mal weitergebracht.

Ich habe es nun so umgeschrieben:

Java:
    Node(Node node) {
	int count =0;
	
	if(count%2 == 0){
	
	    if (node.left != null) {
		this.name = "c_" + node.name;
		this.left = new Node(node.left);
		count++;
	    }
	}
	if(count%2 != 0){  
	    if (node.right != null) {
		this.name = "c_" + node.name;
		this.right = new Node(node.right);
		count++;
	    }
	}
    }

Das mit dem count soll denn Sinn haben, dass nach erneutem Aufruf druch new Node(), nun das rechte Kind kopiert werden soll. Da ist mir nicht besseres eingefallen.

Jedoch wird noch immer nicht, die komplette Struktur kopiert. In der Ausgabe steht folgendes:

Tiefe Kopie:
c_node1 c_node2 c_node3
c_node2 c_node4
c_node4 null


c_node3 c_node2
c_node3 null null
null null

Wie kann ich denn am besten den kompletten Baum durchlaufen, damit jedes Objekt kopiert wird?
 
I

itse

Gast
Hallo,

ich komme einfach nicht weiter. Es ist ja vorgegeben, dass die Ausgabe in folgender Reihenfolge ausgegeben werden soll:

Knoten
Left
Right

Also als preOrder. Ich erhalte aber immer die oben genannte Ausgabe. Ich habe zum Beispiel auch folgendes probiert:

Java:
	if(this.name != null)
	    System.out.print(this.name+" ");
	if(this.left.name != null)
	    System.out.print(this.left.name+" ");
	if(this.right.name != null)
	    System.out.print(this.right.name+" ");

	System.out.println();

	    if(this.left != null)
	        this.left.output();

	    if(this.right != null)
	        this.right.output();
    }

Es kommt aber immer eine NullPointerException nach der zweiten Zeile. Wie kann ich den Inhalt des kompletten Baums ausgeben?

Kann ich dies dann auch für den Copy-Konstruktor nutzen, damit der Baum komplett kopiert wird, also eine tiefe Kopie erzeugt wird?
 
I

itse

Gast
Ich hab den Fehler nun gefunden, so funktionierts:
Java:
	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();

	if (this.left != null)
	    this.left.output();

	if (this.right != null)
	    this.right.output();
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Y Wie greift man auf die Knoten in einem Binärbaum zu? Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
D Binärbaum Blätter finden und Ausgeben Java Basics - Anfänger-Themen 22
O BinärBaum einfügen Java Basics - Anfänger-Themen 13
E Erste Schritte Testklasse Binärbaum Java Basics - Anfänger-Themen 10
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
A Größten Eintrag aus Binärbaum löschen Java Basics - Anfänger-Themen 4
L Ganzen BinärBaum ausgeben? Java Basics - Anfänger-Themen 3
L Binärbaum (Stammbaum) Java Basics - Anfänger-Themen 8
S Binärbaum in PreOrder in ArrayList speichern Java Basics - Anfänger-Themen 0
J Methoden Binärbaum, Traversierung in Array speichern Java Basics - Anfänger-Themen 18
K BinärBaum Java Basics - Anfänger-Themen 4
J Max. Anzahl von Knoten im Binärbaum Java Basics - Anfänger-Themen 3
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
C Binärbaum mit grafischer Ausgabe Java Basics - Anfänger-Themen 0
J Binärbaum formatiert ausgeben. Java Basics - Anfänger-Themen 7
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
W Größtes Element im unsortierten Binärbaum Java Basics - Anfänger-Themen 7
N Generischer Binärbaum - löschen Java Basics - Anfänger-Themen 1
M Binärbaum mit parent-Zeigern Java Basics - Anfänger-Themen 1
B Methoden BinärBaum als String Knoten löschen Java Basics - Anfänger-Themen 5
S Binärbaum kopieren Java Basics - Anfänger-Themen 6
B Binärbaum mit java implementieren! Java Basics - Anfänger-Themen 5
D Binärbaum Suche Java Basics - Anfänger-Themen 5
D Binärbaum probleme Java Basics - Anfänger-Themen 4
P Binärbaum - Primärschlüssel Java Basics - Anfänger-Themen 3
X Fehler Binärbaum Java Basics - Anfänger-Themen 6
PaulG Fragen zu Binärbaum Java Basics - Anfänger-Themen 21
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
P Binärbaum Ordnungsproblem Java Basics - Anfänger-Themen 8
P Generischer Binärbaum (compareTo Frage) Java Basics - Anfänger-Themen 4
P einen binärbaum implementieren Java Basics - Anfänger-Themen 4
M Binärbaum - Problem bei Knoten anhängen / löschen Java Basics - Anfänger-Themen 5
B Binärbaum höhe herausfinden Java Basics - Anfänger-Themen 12
L Rot Scharz Baum von Binärbaum erben Java Basics - Anfänger-Themen 9
S Klassen Aufgabe: Binärbaum überprüfen Java Basics - Anfänger-Themen 16
S Binärbaum Java Basics - Anfänger-Themen 9
S Variable Parameterliste in Binärbaum Java Basics - Anfänger-Themen 2
N BinärBaum Hilfestellung Java Basics - Anfänger-Themen 8
S Binärbaum prüfen, ob sortiert oder unsortiert Java Basics - Anfänger-Themen 6
W Binärbaum zahlen addieren Java Basics - Anfänger-Themen 7
S Binärbaum - Klasse Knoten - Methode Suchen Java Basics - Anfänger-Themen 5
S Binärbaum Java Basics - Anfänger-Themen 7
S Bitte um Hilfe beim unsortierten Binärbaum!! Java Basics - Anfänger-Themen 6
J Binärbaum getSize Java Basics - Anfänger-Themen 4
P Fragen zum Binärbaum Java Basics - Anfänger-Themen 3
S Binärbaum implementieren Java Basics - Anfänger-Themen 6
K Tiefe im Binärbaum Java Basics - Anfänger-Themen 2
G generischer binärbaum Java Basics - Anfänger-Themen 9
G Binärbaum und Wrapperklassen Java Basics - Anfänger-Themen 6
F Binärbaum codieren. Codeproblem! Java Basics - Anfänger-Themen 4
D rekursion im binärbaum Java Basics - Anfänger-Themen 11
0 Binärbaum als verkettete Liste Java Basics - Anfänger-Themen 3
T Binärbaum - noch ein "klitzekleiner Fehler" Java Basics - Anfänger-Themen 4
B Binärbaum auf Vollständigkeit prüfen Java Basics - Anfänger-Themen 15
G Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
G Binärbaum grafisch darstellen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben