Löschen eines Elements aus einem binären Suchbaum
Das Löschen eines Elements aus einem binären Suchbaum ist etwas komplexer als die vorherigen Schritte, da wir verschiedene Fälle abhandeln müssen, je nachdem, welchen Typ der Knoten hat:
- Wenn der Knoten keine Kinder hat (ein Blattknoten), entfernen wir ihn einfach.
- Wenn der Knoten nur ein Kind hat, ersetzen wir ihn durch sein einziges Kind.
- Wenn der Knoten zwei Kinder hat, ersetzen wir ihn durch den kleinsten Wert aus dem rechten Teilbaum oder den größten Wert aus dem linken Teilbaum.
public static BSTNode delete(int value, BSTNode current) {
if (current == null)
return current;
if (value < current.value)
current.leftChild = delete(value, current.leftChild);
else if (value > current.value)
current.rightChild = delete(value, current.rightChild);
else if (value == current.value) {
if (current.leftChild!= null && current.rightChild!= null) {
int min = current.rightChild.value;
BSTNode temp = current.rightChild;
while (temp.leftChild!= null) {
min = temp.leftChild.value;
temp = temp.leftChild;
}
current.value = min;
current.rightChild = delete(min, current.rightChild);
} else if (current.leftChild == null)
return current.rightChild;
else if (current.rightChild == null)
return current.leftChild;
}
return current;
}
Um diese Methode zu testen, löschen wir einige Knoten und drucken den Baum aus:
public static void main(String[] args) {
BSTNode root = new BSTNode(12);
root = insert(7, root);
root = insert(20, root);
root = insert(5, root);
root = insert(9, root);
root = insert(21, root);
// Löschen Sie einige Knoten
root = delete(12, root);
root = delete(20, root);
root = delete(9, root);
// Drucken Sie den Baum aus, um die Löschung zu überprüfen
System.out.println("Durchlauf nach der Löschung: ");
inorderTraversal(root);
}
Ausgabe:
Durchlauf nach der Löschung:
5 7 21