Fang erst mal damit an, dir eine ORDENTLICHE Suchfunktion zu bauen. Das
ist doch Unsinn, da den root Member der Klasse als Hilfsvariable
heranzuziehen.
Das hier
1 | if(o <= root->val)
|
2 | {
|
3 | succ = root->left;
|
4 | pred->left = succ;
|
5 | //Element löschen; momentan ist das Element nur "ausgehängt"
|
6 | }
|
7 | else
|
8 | {
|
9 | succ = root->right;
|
10 | pred->right = succ;
|
11 | //Element löschen; momentan ist das Element nur "ausgehängt"
|
12 | }
|
ist ein wenig zu optimistisch. Mal dir die Situation auf
5
/ \
/ \
3 8
/ \
/ \
1 4
und du willst den Knoten 3 löschen. Dann musst du mit den BEIDEN
Teilbäumen (der 1 UND der 4) etwas machen. Im Moment hängst du nur den
linken Sohn um (die 1), aber die 4 (den rechten Sohn) lässt du unter den
Tisch fallen.
Mal dir die Situation (auch mit noch komplizierteren Bäumen) auf! Wenn
du sowas noch nie gemacht hast, ist es ziemlich unwahrscheinlich, dass
du das im Kopf hinkriegst. Das sind nicht einfach nur 3 Anweisungen und
gut ists. Aus einem binären Suchbaum etwas rauszulöschen ist deutlich
komplizierter (und viel einfacher, wenn man Suchen und Löschen nicht
voneinander trennt, sondern als rekursive Lösch-Funktion schreibt). Aber
erst mal musst du wissen, wie überhaupt das korrekte Ergebnis aussieht.
Also mal dir ein paar Bäume auf, nimm dir irgendeinen Knoten und
überlege, wie der korrekte Baum ohne diesen Knoten aussehen muss. Und
daraus entwickelst du dann deinen Algorithmus, wie du die Lösung nach
Algorithmus IMMER und ZUVERLÄSSIG bekommst.
wie kann denn hier der Fall eintreten, dass o nicht gleich root->val
ist? Deine Suchfunktion hat dir ja genau den Knoten rausgesucht, für den
gilt o IST GLEICH dem root->val. An dieser Stelle MUSS daher o gleich
dem root->val sein. Was anderes ist gar nicht möglich. Es sei denn o ist
überhaupt nicht im Baum vertreten.