seine in Ordnung Nachfolgeknoten oder dessen in Ordnung Vorgängerknoten Wenn ein Knoten mit zwei Kindern zu löschen, können Sie entweder wählen. In diesem Fall wird es zu finden, die die größten Wert in dem linken Unterbaum (dh die am weitesten rechts stehenden Kind seines linken Unterbaumes), was bedeutet, dass es den Knotens in Ordnung Vorgängerknoten findet.
Sobald Sie den Ersatzknoten finden, die Sie nicht wirklich löschen Sie den Knoten gelöscht werden. Stattdessen nehmen Sie den Wert aus dem Nachfolgeknoten und speichern diesen Wert in den Knoten , den Sie löschen möchten. Anschließend löschen Sie den Nachfolgerknoten. So erhalten Sie die binäre Suchbaum - Eigenschaft Dabei da Sie sicher sein können , dass der Knoten , den Sie ausgewählt wird einen Wert haben, der niedriger als die Werte aller Kinder in den ursprünglichen Knoten des linken Unterbaum ist, und größer , dass als die Werte , aller Kinder in den ursprünglichen Knoten des rechten Unterbaum.
BEARBEITEN
Nach der Lektüre Ihrer Frage ein wenig mehr, ich glaube, ich habe das Problem gefunden zu haben.
Normalerweise , was Sie zusätzlich zu der haben deleteFunktion ist eine replaceFunktion, die den fraglichen Knoten ersetzt. Ich glaube , Sie müssen diese Codezeile ändern:
FindParent(largestValue).Right <- 0
zu:
FindParent(largestValue).Right <- largestValue.Left
Wenn der largestValueKnoten kein linkes Kind hat, bekommen Sie einfach nulloder 0. Wenn es ein linkes Kind hat, wird das Kind ein Ersatz für den largestValueKnoten. Also du hast recht; der Code braucht nicht berücksichtigt das Szenario , dass der largestValueKnoten ein linkes Kind haben könnte.
Ein weiterer EDIT
Da Sie nur einen Ausschnitt gepostet haben, bin ich nicht sicher , was der Kontext des Codes ist. Aber die Schnipsel wie geschrieben scheint das Problem haben Sie vorschlagen (den falschen Knoten ersetzen). Normalerweise gibt es drei Fälle, aber ich merke , dass der Kommentar in Ihrem Snippet sagt //Case 4(so vielleicht gibt es einigen anderen Kontext).
Zuvor erwähnte ich auf die Tatsache , dass deletein der Regel mit einem kommt replace. Wenn Sie also das finden largestValueKnoten, löschen Sie es nach den beiden einfachen Fällen (Knoten ohne Kinder, und der Knoten mit einem Kind). Also , wenn Sie an Pseudo-Code suchen einen Knoten mit zwei Kindern zu löschen, ist es das , was Sie tun:
get largestValue from nodeToRemove.Left
nodeToRemove.Value <- largestValue.Value
//now replace largestValue with largestValue.Left
if largestValue = largestValue.Parent.Left then
largestValue.Parent.Left <- largestValue.Left //is largestValue a left child?
else //largestValue must be a right child
largestValue.Parent.Right <- largestValue.Left
if largestValue.Left is not null then
largestValue.Left.Parent <- largestValue.Parent
Ich finde es seltsam, dass ein Datenstrukturen und Algorithmen Buch würde diesen Teil auslassen, also bin ich geneigt zu glauben, dass das Buch weiter die Löschung in ein paar mehr Fälle aufgeteilt hat (da es drei Standardfälle sind), um es einfacher zu verstehen.
Um zu beweisen, dass der obige Code funktioniert, sollten Sie die folgenden Baum:
8
/ \
7 9
Nehmen wir an , die Sie löschen möchten 8. Sie versuchen , finden largestValueaus nodeToRemove.Left. Dies gibt Ihnen 7da den linken Unterbaum nur ein Kind hat.
Dann tun Sie:
nodeToRemove.Value <- largestValue.Value
Was bedeutet:
8.value <- 7.Value
oder
8.Value <- 7
So, jetzt Ihr Baum sieht wie folgt aus:
7
/ \
7 9
Sie müssen sich des Ersatzknoten loszuwerden und so wirst du ersetzen largestValuemit largestValue.Left(was null). Also zuerst finden Sie heraus , welche Art von Kind 7ist:
if largestValue = largestValue.Parent.Left then
Was bedeutet:
if 7 = 7.Parent.Left then
oder:
if 7 = 8.Left then
Da 7heißt 8‚s linkes Kind, ersetzen müssen 8.Leftmit 7.Right( largestValue.Parent.Left <- largestValue.Left). Da 7keine Kinder hat, 7.Leftist null. So largestValue.Parent.Leftwird auf null zugewiesen (was effektiv sein linkes Kind entfernt). Dies bedeutet also , dass Sie mit dem folgenden Baum am Ende:
7
\
9