Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Binärer Suchbaum in ArrayList einsortieren » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Seiten (2): [1] 2 nächste » Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Binärer Suchbaum in ArrayList einsortieren
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Binärer Suchbaum in ArrayList einsortieren Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Meine Frage:
Hallo Zusammen!
Leider stecke ich bei einer Aufgabe fest und weiss einfach nicht, wie ich sie angehen soll.

Und zwar geht es um Folgendes:
Ich soll eine Methode schreiben, die eine (nach dem Schlüssel key) sortierte Liste aller im Binären Suchbaum vorhandenen Elemente (things vom Typ T) zurückgibt.

Das Gerüst sieht folgendermassen aus:

public ArrayList<T>createSortedList ( BinarySearchTree<T> tree) {
return createSortedList(tree, new ArrayList<T>());
}

public ArrayList<T> createSortedList ( BinarySearchTree<T> tree, ArrayList<T> list){

}

Meine Ideen:
Wenn steht, dass sie nach dem Schlüsselwert key sortiert sein soll, dann heisst das, das es keine Rolle spielt, was für ein Wert das jeweilige thing hat. Sondern sortieren nach key heisst, dass ich zuerst die Wurzel ausgib (=0) und dann das 1, 2, 3,.. Element, oder?

Ich habe Mühe, das ganze in eine schöne Liste zu packen.

Kann mir jemand helfen?
31.07.2015 21:04 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Der Binärbaum ist ja bereits sortiert. Die Funktion sieht daher so aus:
1. Füge (durch rekursiven Funktionsaufruf) den linken Ast des Baums hinzu.
2. Füge den Wert des aktuellen Knotens hinzu
3. Füge den rechten Ast hinzu.

Sag' Bescheid, falls du noch etwas Code zur Veranschaulichung brauchst.

__________________
Syntax Highlighting fürs Board (Link)
31.07.2015 21:28 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Danke eulerscheZahl!
Wäre sehr lieb, wenn du noch etwas Code zur Veranschaulichung schreiben könntest!smile
31.07.2015 21:55 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Und ich habe nochmals eine Frage:
Wenn ich den linken Ast hinzufüge, dann den Knoten und dann den rechten Teilbaum, ist er dann sortiert?
Weil muss ich die Elemente nicht nach "key" sortieren? Und wäre der key nicht bei der Wurzel 0 und würde sich dann so fortsetzen:

0
/ \
1 2
/ \ / \
3 4 5 6

Oder verstehe ich nun alles komplett falsch?!

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von infoubi: 31.07.2015 22:06.

31.07.2015 22:05 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ein Binärbaum ist so aufgebaut, dass links von einem Knoten nur Werte vorkommen, die kleiner sind als der betreffende Knoten selbst. Rechts kommen nur größere Werte. (rechts und links kannst du vertauschen, solange du es konsequent machst, ist dann eben absteigend sortiert).
code:
1:
2:
3:
4:
5:
    3
   / \
  1   5
 / \ / \
0  2 4  6


Hier der versprochene Code:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
import java.util.ArrayList;

public class BinarySearchTree<T extends Comparable<T>> {
	T value;
	BinarySearchTree<T> right, left;

	public BinarySearchTree(T value) {
		this.value = value;
	}

	public void add(T toAdd) {
		if (toAdd.compareTo(value) <= 0) { // Wert ist kleiner/gleich der Wurzel
			if (left == null)
				left = new BinarySearchTree<T>(toAdd);
			else
				left.add(toAdd);
		} else { // Wert ist größer als die Wurzel
			if (right == null)
				right = new BinarySearchTree<T>(toAdd);
			else
				right.add(toAdd);
		}
	}

	public ArrayList<T> createSortedList(BinarySearchTree<T> tree) {
		return createSortedList(tree, new ArrayList<T>());
	}

	private ArrayList<T> createSortedList(BinarySearchTree<T> tree,
			ArrayList<T> list) {
		if (tree.left != null)
			createSortedList(tree.left, list);
		list.add(tree.value);
		if (tree.right != null)
			createSortedList(tree.right, list);
		return list;
	}
}

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {
		BinarySearchTree<Integer> tree = new BinarySearchTree<Integer>(3);
		tree.add(1);
		tree.add(0);
		tree.add(2);
		tree.add(5);
		tree.add(4);
		tree.add(6);

		ArrayList<Integer> list = tree.createSortedList(tree);
		for (int i : list)
			System.out.println(i);
	}
}


__________________
Syntax Highlighting fürs Board (Link)
01.08.2015 07:35 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hallo eulerscheZahl
Danke für deine Antwort.
Leider verstehe ich es aber noch nie so ganz.. Also vorallem die add Methode.

Also von der Wurzel aus schauen wir, ob wir links einen Nachfolger haben. Ist das der Fall, rufen wir rekursik erneut die Methode auf, so lange, bis wir keinen linken Nachfolger mehr haben. (Wir sind bei einem Blatt angelangt.)

Dieses Blatt müssten wir ja jetzt in unserem Array speichern. Aber was passiert genau bei der add Methode? Wieso müssen wir da noch etwas vergleichen?

Wenn wir ganz links angekommen sind, dann können wir es doch einfach hinzufügen?

Und wieso machen wir dort einen new BinarySearchTree?

Ach herje...Entschuldige bitte meine Unfähigkeit..:/
01.08.2015 10:03 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Kein Problem, für solche Fragen ist das Board ja da.

Ich habe oben einen Binärbaum dargestellt, der wie gesagt sortiert ist. Die Methode add fügt das neue Element daher auch nicht irgendwo ein, sondern passt auf, dass die Sortierung erhalten bleibt. Ich nehme auch nicht immer den linken Ast, sondern nur, wenn das einzufügende Element kleiner oder gleich dem des aktuellen Knotens ist.
Und wenn ich die Stelle gefunden habe, wo ich den Knoten einfügen will, muss ich den neuen Knoten auch erstellen (new BinarySearchTree).

__________________
Syntax Highlighting fürs Board (Link)
01.08.2015 10:13 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ach so, aber demfall erstelle ich so einen Baum?

Ich möchte ja eigentlich von einem gegebenen Baum eine sortierte ArrayListe erstellen. Für das muss ich ja keinen neuen Knoten machen? Oder?
01.08.2015 10:27 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Nein. Aber damit man einen Baum ausgeben kann, muss man erst mal einen haben. Ich will ja auch testen können, dass ich dir keinen Unsinn schreibe.

__________________
Syntax Highlighting fürs Board (Link)
01.08.2015 11:12 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ok, danke!

Aber wenn ich jetzt wirklich nur eine Liste ausgeben müsste, ohne zusätzliche weitere Methode (wie hier add).
Wie bringe ich dann die Werte auf die Liste?
01.08.2015 11:17 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Vom Baum in die Liste kriegst du die Werte mit createSortedList. Zeile 33: list.add(tree.value);
Aber dazu müssen die Werte ja erst mal in den Baum, dafür habe ich mir die Methode add geschrieben.

__________________
Syntax Highlighting fürs Board (Link)
01.08.2015 11:28 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ok, aber eigentlich hätte ich die Werte vorher bereits in einen Baum eingefüllt. Mit einer insert-Methode.

Und von diesem Baum muss ich jetzt die ArrayListe zurückgeben. Dann wäre es ja falsch, wenn ich die Werte "nochmals" einfügen würde?


Meine Insert Methode würde etwa so ausehen:

public BinarySearchTree<T> insert(BinarySearchTree<T> tree, int key, T thing) {

if(tree==null)
return new BinarySearchTree<T>(key,thing);

if(tree.key==key)
tree.thing=thing;
if(key< tree.key)
tree.left=insert(tree.left, key,thing);
if(key> tree.key)
tree.right=insert(tree.right, key, thing);

return tree;

}

(Stimmt das so überhaupt?)
01.08.2015 12:08 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Unsere Bäume unterscheiden sich etwas:
* du hast ein Key Value Paar, bei mir ist das beides eins.
* du übergibst den Baum an die Funktion (und könntest sie somit static deklarieren), ich verwende this.
* du überschreibst bei gleichem Key den alten Wert, ich habe dann mehrere gleiche Einträge

Beide Seiten haben ihre Vorteile und Nachteile, da wählt man je nach Anwendungsfall das passende aus.

Und ich schreibe die Werte nur einmal in die ArrayList. Führe das Programm aus, dann wirst du schon sehen, dass keine Zahl doppelt erscheint.

__________________
Syntax Highlighting fürs Board (Link)
01.08.2015 13:13 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
infoubi
Jungspund


Dabei seit: 30.07.2015
Beiträge: 14

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ok, alles klar. :-)

Aber wenn ich meinen Baum in eine ArrayList wandeln würde, wie müsste ich da vorgehen? Da kann ich ja eben nicht deine add Methode verwenden, oder habe ich das Prinzip einfach noch nicht verstanden?

Weil die insert Methode soll so stehen bleiben und dann in einem nächsten Schritt die sortierte Liste ausgegeben werden.
01.08.2015 14:10 infoubi ist offline Beiträge von infoubi suchen Nehmen Sie infoubi in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Die add Methode ist nur zum Erzeugen eines Baums der dann ausgegeben werden kann. Sie ist nicht Teil deiner Aufgabe.
Die Umwandlung in eine ArrayList erfolgt, wie von dir vorgegeben, mit createSortedList.

Du musst dann eben thing hinzufügen, statt value, ansonsten ändert sich nichts.

__________________
Syntax Highlighting fürs Board (Link)
01.08.2015 14:32 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Seiten (2): [1] 2 nächste » Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Algorithmen » Binärer Suchbaum in ArrayList einsortieren