Binärer Suchbaum #5

Merged
Denys Konovalov merged 4 commits from ibartkowski/info-java:main into main 2024-12-07 23:08:48 +01:00
2 changed files with 173 additions and 0 deletions

View File

@ -0,0 +1,112 @@
// Generische Klasse für einen Binären Suchbaum
class BinaererSuchbaum<T extends Comparable<T>> {
// Knoten-Klasse
private static class Knoten<T> {
T daten;
Knoten<T> links, rechts;
Knoten(T daten) {
this.daten = daten;
links = rechts = null;
}
}
private Knoten<T> wurzel;
// Methode zum Hinzufügen von Elementen
public void hinzufuegen(T wert) {
this.wurzel = hinzufuegen(wert, wurzel);
}
private Knoten<T> hinzufuegen(T wert, Knoten<T> wurzel) {
if (wert != null)
if (wurzel == null)
wurzel = new Knoten<T>(wert);
else
if (wert.compareTo(wurzel.daten) < 0)
wurzel.links = hinzufuegen(wert, wurzel.links);
else if (wert.compareTo(wurzel.daten) > 0)
wurzel.rechts = hinzufuegen(wert, wurzel.rechts);
return wurzel;
}
// Methode zur Suche eines Elements
public T suchen(T wert) {
return suchen(wert, wurzel);
}
private T suchen(T wert, Knoten<T> wurzel) {
if (wurzel == null || wert == null)
return null;
else
if (wert.compareTo(wurzel.daten) < 0)
return suchen(wert, wurzel.links);
else if (wert.compareTo(wurzel.daten) > 0)
return suchen(wert, wurzel.rechts);
else if (wert.compareTo(wurzel.daten) == 0)
return wurzel.daten;
else
return null;
}
// Methode zum Löschen eines Elements
public void loeschen(T wert) {
this.wurzel = loeschen(wert, wurzel);
}
private Knoten<T> loeschen(T wert, Knoten<T> wurzel) {
if (wurzel != null && wert != null)
if (wert.compareTo(wurzel.daten) < 0)
wurzel.links = loeschen(wert, wurzel.links);
else if (wert.compareTo(wurzel.daten) > 0)
wurzel.rechts = loeschen(wert, wurzel.rechts);
else if (wurzel.links == null)
if (wurzel.rechts == null)
wurzel = null;
else
wurzel = wurzel.rechts;
else
if (wurzel.rechts == null)
wurzel = wurzel.links;
else {
Knoten<T> minInhalt = blattSuchen(wurzel, false);
minInhalt.links = wurzel.links;
wurzel = minInhalt;
wurzel.rechts = loeschen(minInhalt.daten, wurzel.rechts);
}
return wurzel;
}
public Knoten<T> blattSuchen(Knoten<T> wurzel, boolean links) {
if (wurzel.daten == null)
return null;
else
if (links)
if (wurzel.links == null)
return wurzel;
else
return blattSuchen(wurzel.links, links);
else
if (wurzel.rechts == null)
return wurzel;
else
return blattSuchen(wurzel.rechts, links);
}
// Inorder-Traversierung für Ausgabe
public void inorderAusgabe() {
inorderRekursiv(wurzel);
System.out.println();
}
private void inorderRekursiv(Knoten<T> knoten) {
if (knoten != null) {
inorderRekursiv(knoten.links);
System.out.print(knoten.daten + " ");
inorderRekursiv(knoten.rechts);
}
}
}

View File

@ -0,0 +1,61 @@
import java.util.Scanner;
public class BinaererSuchbaumDemoSchueler {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
BinaererSuchbaum<Double> baum = new BinaererSuchbaum<>();
boolean laeuft = true;
while (laeuft) {
System.out.println("\nBinärer Suchbaum - Menü:");
System.out.println("0. Elemente automatisch hinzufügen");
System.out.println("1. Element hinzufügen");
System.out.println("2. Element suchen");
System.out.println("3. Element löschen");
System.out.println("4. Baum anzeigen (Inorder-Traversierung)");
System.out.println("5. Programm beenden");
System.out.print("Wähle eine Option: ");
int auswahl = scanner.nextInt();
double element;
switch (auswahl) {
case 0:
for (double i = -15; i <= 15; i+=0.5) {
System.out.println("Zu hinzufügendes Element: " + i);
baum.hinzufuegen(i);
System.out.println("Element hinzugefügt.");
}
break;
case 1 :
System.out.print("Zu hinzufügendes Element: ");
element = scanner.nextDouble();
baum.hinzufuegen(element);
System.out.println("Element hinzugefügt.");
break;
case 2 :
System.out.print("Zu suchendes Element: ");
element = scanner.nextDouble();
boolean gefunden = baum.suchen(element) != null;
System.out.println(gefunden ? "Element gefunden." : "Element nicht gefunden.");
break;
case 3 :
System.out.print("Zu löschendes Element: ");
element = scanner.nextDouble();
baum.loeschen(element);
System.out.println("Element gelöscht (falls vorhanden).");
break;
case 4 :
System.out.println("Baum (Inorder-Traversierung):");
baum.inorderAusgabe();
break;
case 5 :
laeuft = false;
System.out.println("Programm wird beendet.");
break;
default : System.out.println("Ungültige Auswahl. Bitte versuche es erneut."); break;
}
}
scanner.close();
}
}