From 14abc4faae2cc50bee29e8510734f9a72a1a5654 Mon Sep 17 00:00:00 2001 From: Denys Konovalov Date: Sat, 7 Dec 2024 23:08:47 +0100 Subject: [PATCH] =?UTF-8?q?Bin=C3=A4rer=20Suchbaum=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.cantorgymnasium.de/denyskon/info-java/pulls/5 --- BinaererSuchbaum/BinaererSuchbaum.java | 112 ++++++++++++++++++ .../BinaererSuchbaumDemoSchueler.java | 61 ++++++++++ 2 files changed, 173 insertions(+) create mode 100644 BinaererSuchbaum/BinaererSuchbaum.java create mode 100644 BinaererSuchbaum/BinaererSuchbaumDemoSchueler.java diff --git a/BinaererSuchbaum/BinaererSuchbaum.java b/BinaererSuchbaum/BinaererSuchbaum.java new file mode 100644 index 0000000..796b450 --- /dev/null +++ b/BinaererSuchbaum/BinaererSuchbaum.java @@ -0,0 +1,112 @@ +// Generische Klasse für einen Binären Suchbaum +class BinaererSuchbaum> { + // Knoten-Klasse + private static class Knoten { + T daten; + Knoten links, rechts; + + Knoten(T daten) { + this.daten = daten; + links = rechts = null; + } + } + + private Knoten wurzel; + + // Methode zum Hinzufügen von Elementen + public void hinzufuegen(T wert) { + this.wurzel = hinzufuegen(wert, wurzel); + } + + private Knoten hinzufuegen(T wert, Knoten wurzel) { + if (wert != null) + if (wurzel == null) + wurzel = new Knoten(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 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 loeschen(T wert, Knoten 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 minInhalt = blattSuchen(wurzel, false); + minInhalt.links = wurzel.links; + wurzel = minInhalt; + wurzel.rechts = loeschen(minInhalt.daten, wurzel.rechts); + } + + return wurzel; + } + + public Knoten blattSuchen(Knoten 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 knoten) { + if (knoten != null) { + inorderRekursiv(knoten.links); + System.out.print(knoten.daten + " "); + inorderRekursiv(knoten.rechts); + } + } +} \ No newline at end of file diff --git a/BinaererSuchbaum/BinaererSuchbaumDemoSchueler.java b/BinaererSuchbaum/BinaererSuchbaumDemoSchueler.java new file mode 100644 index 0000000..516d1b0 --- /dev/null +++ b/BinaererSuchbaum/BinaererSuchbaumDemoSchueler.java @@ -0,0 +1,61 @@ +import java.util.Scanner; + +public class BinaererSuchbaumDemoSchueler { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + BinaererSuchbaum 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(); + } +} \ No newline at end of file