diff --git a/Baum/src/Baum.java b/Baum/src/Baum.java index 4867332..3eabd36 100644 --- a/Baum/src/Baum.java +++ b/Baum/src/Baum.java @@ -3,10 +3,10 @@ import java.util.Queue; public class Baum { private Knoten wurzel; - + private Queue ll = new LinkedList(); private StringBuilder sb; - + public void add(int wert) { if (wurzel == null) { wurzel = new Knoten(wert); @@ -15,26 +15,31 @@ public class Baum { wurzel.add(wert); } - + public void inorder() { wurzel.inorder(); } - + + public void remove(int wert) { + if (wurzel != null) + wurzel.remove(wert); + } + public String toString() { // Breitensuche if (wurzel == null) return "Baum ist noch leer"; - + sb = new StringBuilder(); ll.add(wurzel); wurzel.breitensuche(); - + return sb.toString(); } // ---------- - + class Knoten { private int wert; private Knoten links, rechts; @@ -46,7 +51,7 @@ public class Baum { public void add(int neuerWert) { if (this.wert == neuerWert) throw new RuntimeException("Doppelte Werte nicht erlaubt."); - + if (neuerWert < this.wert) if (this.links == null) links = new Knoten(neuerWert); @@ -58,34 +63,70 @@ public class Baum { else rechts.add(neuerWert); } - + public void inorder() { // links if (this.links != null) this.links.inorder(); - + // ausgabe System.out.println(this.wert); - + // rechts if (this.rechts != null) this.rechts.inorder(); } - + public void breitensuche() { if (links != null) ll.add(this.links); if (rechts != null) ll.add(this.rechts); - + sb.append(ll.poll().wert + " "); - + if (ll.size() == 0) return; - + ll.peek().breitensuche(); } + public void remove(int wert) { + if (wert < this.wert && links != null) + if (links.wert == wert) { + if (links.links == null && links.rechts == null) // keine Kinder + links = null; + else if (links.links != null && links.rechts == null) // linkes Kind + links = links.links; + else if (links.rechts != null && links.links == null) // rechtes Kind + links = links.rechts; + else { + Knoten alt = links; + links = links.links.größterImTeilbaum(); + links.links = alt.links; + links.rechts = alt.rechts; + } + } else + links.remove(wert); + if (wert > this.wert && rechts != null) + if (rechts.wert == wert) + rechts = null; + else + rechts.remove(wert); + } + + private Knoten größterImTeilbaum() { + if (this.rechts != null) { + Knoten kind = this.rechts.größterImTeilbaum(); + if (rechts == kind) + rechts = null; + + return kind; + } + + return this; + } + } - + } diff --git a/Baum/src/Main.java b/Baum/src/Main.java index fa1557d..e612881 100644 --- a/Baum/src/Main.java +++ b/Baum/src/Main.java @@ -7,10 +7,14 @@ public class Main { b1.add(42); b1.add(21); b1.add(84); + b1.add(25); + b1.add(27); b1.add(11); - // b1.inorder(); + b1.remove(21); + + b1.inorder(); System.out.println(b1.toString());