Binary Search Tree - Nummerierung in Inorder

skuki

Aktives Mitglied
Hallo,

beschäftige mich gerade mit Binären Suchbäumen.

Methoden wie löschen, hinzufügen ect. sind klar, doch komme ich bei einer Methode nicht weiter.

Ich möchte das Element an der x-ten Stelle bzw. mit einem bestimmten key in Inorder-Traversierung finden.

Einen Binären Baum in inorder ausgeben ist nicht das Problem

Code:
 public void inOrderTraverseTree(Node root){
		 if(root != null){
			 inOrderTraverseTree(root.leftChild);
			 System.out.println(root);
			 inOrderTraverseTree(root.rightChild); 
		 }	 
	 }

Wenn ich das ganze in eine Liste oder Array abspeichern könnte, würde es sicherlich auch irgendwie gehen es durchzunummerieren. (Schleife und fertig)

Aber wie stelle ich es an, wenn ich keine zusätzliche Datenstruktur verwenden will um Speicherplatz zu sparen?

Denke es muss rekursiv ablaufen. Doch wie beginne ich hier?

Vielen Dank für ein paar Tipps!
 

CSHW89

Bekanntes Mitglied
Was möchtest du denn genau haben? Jenachdem sieht die Lösung auch anders aus.
- Den Wert des x-ten Elements
- Prüfen, ob es ein Element mit einem bestimmten Key vorhanden ist (den Wert davon macht keinen Sinn, da es ja der Key ist)
- Den Weg zum x-ten Element
- Den Weg zu einem Element mit einem bestimmten Key

lg Kevin
 

skuki

Aktives Mitglied
Hallo, danke für deine Antwort.

Ich müsste nur wissen wie man über den Baum iteriert. Speziell würde mich einmal das x-te Element interessieren.

lg
 

CSHW89

Bekanntes Mitglied
Ok, da gibt es ein paar Möglichkeiten. Die erste ist z.b. die derzeitige Position immer zu übergeben und am Ende zurückzugeben. Das Problem dabei ist, dass du zusätzlich das gefundene Element zurückgeben willst. Einer Methode zwei Werte zurück geben zu lassen funkioniert zwar, machts aber etwas komplizierter.
Die zweite wäre die derzeitige Position als mutable Objekt (sowas wie MutableInt) zu übergeben. Wenn sich der Wert des Objekts ändert, bekommen auch alle anderen Aufrufebenen die Änderung mit. Da Java kein MutableInt hat, kann man sich mit einem int-Array mit nur einem Eintrag behelfen:
Java:
private Object getPrivate(Node root, int x, int[] position) {
    Object res = getPrivate(root.left, x, position);
    If (res != null) return res;  // im linken Teilbaum gefunden
    
    if (x == position[0])
        return root.value
    position[0]++;  // Erhöhung bekommen auch aufrufende Methoden mit, da int-Array mutable ist
    
    Object res = getPrivate(root.right, x, position);
    If (res != null) return res;  // im rechten Teilbaum gefunden
    
    return null;
}

public Object get(Node root, int x) {
    return getPrivate(root, x, {0});
}
 
Zuletzt bearbeitet:

skuki

Aktives Mitglied
Hallo,

erstmals vielen Dank für deine Antwort.


Habe den Code jetzt so eingefügt und nur dahingehend verändert dass ich kein Object habe sondern eine Node und den key (int) zurückgeben will an der gewissen Position.

Sieht jetzt wie folgt aus:

Code:
	 private Node getValueAtPosition(Node root, int x, int[] position) {
		    Node res = getValueAtPosition(root.leftChild, x, position);
		    
		    if(res != null) return res;  // im linken Teilbaum gefunden
	
		    if (x == position[0])
		        return root;
		    
		    position[0]++;  // Erhöhung bekommen auch aufrufende Methoden mit, da int-Array mutable ist
		 
		    res = getValueAtPosition(root.rightChild, x, position);
		    if (res != null) return res;  // im rechten Teilbaum gefunden
		 
		    return null;
		}
		 
	 
		public int valueAtPosition(int x) {
			int[] position = {0};
	        return getValueAtPosition(root, x, position ).key;
	    }

Das erste Problem ist, dass ich eine Nullpointer Ex bekomme.

Das zweite was ich mich frage ist, ob hier wirklich auch in inorder gesucht wird? Oder greift der erste rekursive Aufruf mit root.leftChild eh genau so tief?

Vielen Dank für deine Hilfe!
 

CSHW89

Bekanntes Mitglied
Die Nullpointer Exception bekommst du genau dann, wenn es kein x-tes Element gibt, also x zu groß ist. Dann ist die Prüfung "(x == position[0])" nie erfüllt, und die Funktion gibt auf jeder Aufrufebene null zurück.
InOrder bedeutet du suchst erst den linken Teilbaum ab, dann den Root, und dann den rechten Teilbaum, und das natürlich rekursiv. D.h. du suchst erst im linken Teilbaum, dann im linken vom linken, dann im linken vom linken vom linken usw...
Irgendwann bist du beim linkesten Blatt, das ist das erste (bzw. nullte) Element. Das zweite (bzw. erste) ist dann dessen Vater usw...

lg Kevin
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
C binary search trees - order Java Basics - Anfänger-Themen 8
G Frage zu Binary Search Java Basics - Anfänger-Themen 3
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
R Operatoren Bad operand types for binary operator Java Basics - Anfänger-Themen 4
L Operatoren error: bad operand types for binary operator && Java Basics - Anfänger-Themen 8
I bad operand types for binary operator > Java Basics - Anfänger-Themen 5
H Operatoren Fehler bad operand types for binary operator Java Basics - Anfänger-Themen 7
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
J bad operand types for binary operator Java Basics - Anfänger-Themen 3
N Compiler-Fehler Dezimal to binary Java Basics - Anfänger-Themen 2
StupidAttack Binary Operations Java Basics - Anfänger-Themen 13
D Javacode direkt in Betriebsystemabhängiges binary umwandeln Java Basics - Anfänger-Themen 5
M Einlesen von Binärdateien (binary interleaved by line) Java Basics - Anfänger-Themen 3
H Serialization: Was ist besser(schneller) Binary <-> XM Java Basics - Anfänger-Themen 2
5 String To Binary Java Basics - Anfänger-Themen 26
L Ist eine Datei binary oder text encoded Java Basics - Anfänger-Themen 8
R Binary Stream in Bild umwandeln Java Basics - Anfänger-Themen 5
S Java TelephoneBookEntry search Java Basics - Anfänger-Themen 2
L Breadth-First Search statt einem Pfad, alle Pfade herausfinden Java Basics - Anfänger-Themen 4
T filecontentheader search Java Basics - Anfänger-Themen 16
M Search in ArrayList<T>? Java Basics - Anfänger-Themen 8
S [EDIT] Tiefensuche / Depth-First-Search / Greedy Algorithmus Java Basics - Anfänger-Themen 6
M Parse-Tree eines statements darstellen Java Basics - Anfänger-Themen 0
RudiRüssel Tree Java Basics - Anfänger-Themen 3
Vince42 NIO File Tree in XML umwandeln Java Basics - Anfänger-Themen 10
P expression tree Java Basics - Anfänger-Themen 4
T Expression Tree.. identifier + Grundaufbau? Java Basics - Anfänger-Themen 2
A Anzahl nodes in einem Tree Java Basics - Anfänger-Themen 2
L Linksrotation RedBlack Tree Java Basics - Anfänger-Themen 3
M AVL Tree Java Basics - Anfänger-Themen 4
L Binear Tree Java Basics - Anfänger-Themen 5
L File Tree Node ausgeben Java Basics - Anfänger-Themen 2
L File Tree rekursiv Java Basics - Anfänger-Themen 10
V libssrckdtree-j Generic k-d tree Java library - weiss nicht wo des hin soll Java Basics - Anfänger-Themen 2
T Java Tree Frage Java Basics - Anfänger-Themen 2
P Tree aus XML Daten aufbauen Java Basics - Anfänger-Themen 9
R Tree gefüllt mit den Directory Java Basics - Anfänger-Themen 2
B API für Tree Java Basics - Anfänger-Themen 4
M Pfade in Tree einbinden Java Basics - Anfänger-Themen 2
R Multiway Tree Java Basics - Anfänger-Themen 3
G tree rekursiv Java Basics - Anfänger-Themen 8
R Tree + bilder ? Java Basics - Anfänger-Themen 7
M Minimal Spanning Tree mit Greedy Java Basics - Anfänger-Themen 2
J Erweitern eines Tree-Pfades? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben