Löschverfahren für einen binären Suchbaum

stimmen
7

Betrachten Sie den Löschvorgang auf einem BST, wenn der Knoten zu löschen zwei Kinder hat. Lassen Sie sich sagen, dass ich ersetzen es immer mit dem Knoten den minimalen Schlüssel in seinem rechten Teilbaum zu halten.

Die Frage ist: ist dieses Verfahren kommutativ? Das heißt, x zu löschen und dann hat y das gleiche Ergebnis als ersten y und dann x zu löschen?

Ich denke, die Antwort ist nein, aber ich kann ein Gegenbeispiel nicht finden, noch Figur jede gültige Argumentation aus.

BEARBEITEN:

Vielleicht muss ich klarer sein.

Betrachten Sie das transplant(node x, node y)Verfahren: es ersetzen x mit y (und dessen Unterbaum). Also, wenn ich einen Knoten löschen möchten (zB x) , die zwei Kinder hat i ersetzen Sie es mit dem Knoten der minimalen Schlüssel in seiner rechten Teilbaum hält:

y = minimum(x.right)
transplant(y, y.right) // extracts the minimum (it doesn't have left child)
y.right = x.right
y.left = x.left
transplant(x,y)

Die Frage war, wie das Verfahren oben zu beweisen, nicht kommutativ ist.

Veröffentlicht am 07/06/2010 um 15:46
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
17

Löschen (im Allgemeinen) nicht kommutativ. Hier ist ein Gegenbeispiel:

    4
   / \
  3   7
     /
    6

Was passiert, wenn wir 4 löschen und dann 3?

Wenn wir 4 löschen, erhalten wir 6 als neue Wurzel:

   6
  / \
 3   7

3 Löschen nicht den Baum ändern, sondern gibt uns dies:

  6
   \
    7

Was passiert, wenn wir 3 löschen und dann 4?

Wenn wir 3 Löschen der Baum nicht ändert:

 4
  \
   7
  /
 6

Wenn wir jedoch nun 4 löschen, die neue Wurzel wird 7:

  7
 /
6

Die beiden resultierenden Bäume sind nicht die gleichen, deshalb Löschung nicht kommutativ ist.

AKTUALISIEREN

Ich lese nicht die Einschränkung, dass dies, wenn Sie immer einen Knoten mit 2 Kindern löschen. Meine Lösung ist für den allgemeinen Fall. Ich werde es aktualisieren, wenn / wenn ich ein Gegenbeispiel finden.

UPDATE ANOTHER

Ich habe keine konkreten Beweise, aber ich werde eine Vermutung zu wagen:

Im allgemeinen Fall behandeln Sie Löschungen unterschiedlich je nachdem, ob Sie haben zwei Kinder, ein Kind, oder keine Kinder. Im Gegenbeispiel I vorgesehen ist, lösche ich zuerst einen Knoten mit zwei Kindern und dann ein Knoten mit einem Kind. Danach, lösche ich einen Knoten ohne Kinder und dann einen anderen Knoten mit einem Kind.

Im speziellen Fall von nur Knoten mit zwei Kindern zu löschen, mögen Sie den Fall betrachten, wo beide Knoten in dem gleichen Unterbaum sind (da sie nicht, wenn sie in verschiedenen Teilbäumen sind, würden egal, man kann sicher sein, dass die Gesamtstruktur nicht in der Größenordnung des Löschens basierend ändern). Was Sie wirklich unter Beweis stellen müssen, ist, ob die Reihenfolge der Löschung von Knoten in dem gleichen Unterbaum, wobei jeder Knoten zwei Kinder hat, Angelegenheiten.

Betrachten wir zwei Knoten A und B, wobei A ein Vorfahre von B ist, dann können Sie noch die Frage verfeinern zu sein:

Ist Löschen kommutativ, wenn Sie die Löschung von zwei Knoten von einem binären Suchbaum erwägen, die eine Vorfahr-Nachkommen Beziehung zueinander haben (dies würde bedeuten, dass sie in dem gleichen Unterbaum sind)?

Wenn Sie einen Knoten löschen (sich A sagt), können Sie den richtigen Unterbaum durchqueren das kleinste Element zu finden. Dieser Knoten wird ein Blattknoten sein und kann nie zu B gleich sein (weil B hat zwei Kinder und kann kein Blattknoten sein). Sie würden dann mit dem Wert dieses Blattknoten den Wert von A ersetzen. Was dies bedeutet ist, dass die einzige strukturelle Veränderung an den Baum mit dem Wert des Blattknoten, und der Verlust des Blattknoten den Ersatz von A Wert ist.

Der gleiche Prozess wird für B. beteiligt Das heißt, der Wert des Knotens ersetzen und einen Blattknoten ersetzen. So im Allgemeinen, wenn Sie einen Knoten mit zwei Kindern löschen, die einzigen strukturellen Veränderungen ist die Wertänderung des Knotens Sie löschen und das Löschen des Blattknotens , wen Wert , den Sie als Ersatz verwenden .

Die Frage ist also weiter verfeinert:

Können Sie garantieren, dass Sie immer den gleichen Ersatzknoten der Reihenfolge der Löschung unabhängig erhalten (wenn Sie immer einen Knoten mit zwei Kindern zu löschen)?

Die Antwort (glaube ich) ist ja. Warum? Hier sind ein paar Beobachtungen:

  • Angenommen , Sie haben den Nachkomme Knoten löschen ersten und den Vorfahrenknoten Sekunde. Der Unterbaum, der modifiziert wurde , wenn Sie den Nachkommen Knoten gelöscht ist nicht im linken Unterbaum der rechten Kindes Vorfahrenknoten. Dies bedeutet , dass dieser Teilbaum bleibt unberührt. Was dies bedeutet auch, unabhängig von der Reihenfolge des Löschens, zwei verschiedene Unterbäume modifiziert sind und daher ist der Betrieb kommutativ.
  • Ersten und den Vorfahrenknoten zweiten wieder, sagen wir , Sie den Nachkomme Knoten löschen. Der Unterbaum, der modifiziert wurde , wenn Sie den Nachkommen Knoten gelöscht ist im linken Unterbaum der rechten Kindes Vorfahrenknoten. Aber auch hier gibt es keine Überschneidungen. Der Grund dafür ist , wenn Sie den Nachkommen Knoten zuerst löschen, Sie an dem linken Unterbaum des Nachkommen Knotens aussehen rechtsen Kindes. Wenn Sie dann den Vorfahrenknoten löschen, werden Sie nie , dass Unterbaum nach unten gehen , da Sie immer nach links gehen , nachdem Sie den Vorfahrenknoten des rechten Kindes linken Unterbaum ein. Also noch einmal, unabhängig davon , was löschen Sie zuerst modifizieren Sie verschiedene Unterbäume und so scheint es , um keine Rolle spielt.
  • Ein anderer Fall ist , wenn Sie den Vorfahrenknoten zuerst löschen und Sie feststellen , dass der minimale Knoten ein Kind des Nachkommen Knoten ist. Dies bedeutet , dass der Abkömmling Knoten mit einem Kind am Ende wird, und das Löschen von einem Kind ist trivial. Betrachten wir nun den Fall, dass in diesem Szenario Sie Nachkomme Knoten zuerst gelöscht. Dann würden Sie den Wert des Nachkommen Knoten mit dem rechten Kind ersetzen und dann das richtige Kind löschen. Wenn Sie dann den Vorfahrenknoten löschen, beenden Sie die Suche auf gleiche Mindest Knoten (die alte linke Kind des gelöschten Knoten, die auch das linke Kind ersetzt Knoten). So oder so, am Ende mit der gleichen Struktur auf.

Dies ist kein strenger Beweis; Dies sind nur einige Beobachtungen, die ich gemacht habe. Mit allen Mitteln, fühlen sich frei, Löcher zu stecken!

Beantwortet am 07/06/2010 um 18:32
quelle vom benutzer

stimmen
0

Ich reagiere hier Vivin zweite Update.

Ich denke, dass dies eine gute Neufassung der Frage ist:

Ist Löschen kommutativ, wenn Sie die Löschung von zwei Knoten von einem binären Suchbaum erwägen, die eine Vorfahr-Nachkommen Beziehung zueinander haben (dies würde bedeuten, dass sie in dem gleichen Unterbaum sind)?

aber dieser kühne Satz unten ist nicht wahr:

Wenn Sie einen Knoten löschen (sich A sagt), können Sie den richtigen Unterbaum durchqueren das kleinste Element zu finden. Dieser Knoten wird ein Blattknoten sein und kann nie gleich nach B

da das kleinste Element in der rechten Unterbaum des A kann ein rechtes Kind haben . So ist es kein Blatt. Lassen Sie uns das kleinste Element in A des rechten Teilbaum nennen successor(A). Nun, es ist wahr , dass B kann nicht sein successor(A), aber es kann in seinem rechten Teilbaum sein. Also, es ist ein Chaos.

Ich versuche zusammenzufassen.

Hypothese :

  1. A und B haben zwei Kinder je.
  2. A und B sind in der gleichen Teilstruktur.

Andere Sachen wir aus Hypothese ableiten können:

  1. B ist nicht successor(A), ist weder ein successor(B).

Nun gegeben, dass ich denke, es gibt 4 verschiedene Fälle (wie üblich, lassen Sie ein Vorfahre von B A sein):

  1. B befindet sich in einem linken Unterbaum
  2. B ist ein Vorfahre von successor(A)
  3. successor(A) ist ein Vorfahr von B
  4. B und Nachfolger (A) haben keine Beziehung. (Sie sind in verschiedenen A der Teilbäume)

Ich denke (aber natürlich ich es nicht beweisen kann) , dass die Fälle 1, 2 und 4 keine Rolle. Also, nur in dem Fall successor(A)ist ein Vorfahre von B Löschvorgang nicht kommutativ sein könnte. Oder könnte es?

Ich gehe den Ball:)

Grüße.

Beantwortet am 11/06/2010 um 18:45
quelle vom benutzer

stimmen
2

Es scheint mir, dass das Gegenbeispiel in Vivin Antwort gezeigt der einzige Fall von Nicht-Kommutativität ist, und dass es in der Tat durch die Beschränkung beseitigt, die nur mit zwei Kindern Knoten können gelöscht werden.

Aber es kann auch weggelassen werden, wenn wir verwerfen, was man von Vivin Räumlichkeiten zu sein scheint, das ist, dass wir den richtigen Unterbaum so wenig wie möglich durchqueren sollten alle akzeptablen Nachfolger zu finden. Wenn stattdessen fördern wir immer den kleinsten Knoten im rechten Teilbaum als Nachfolger, unabhängig davon, wie weit weg erweist es sich befinden, dann auch, wenn wir die Beschränkung auf das Löschen Knoten mit weniger als zwei Kinder, Vivin Ergebnis entspannen

    7
   /
  6
wenn wir nie beginnen erreicht bei

    4
   / \
  3 7
     /
    6

Stattdessen würden wir zunächst 3 (ohne Nachfolger) löschen und dann 4 löschen (mit 6 als Nachfolger), wodurch man

    6
     \
      7

Das ist das gleiche wie wenn die Reihenfolge der Löschung rückgängig gemacht wurde.

Streichung würde dann kommutativ sein, und ich denke, es ist immer kommutativ ist, angesichts der Prämisse ich genannt habe (Nachfolger ist immer kleinster Knoten in der rechten Teilbaum von gelöschten Knoten).

Ich habe nicht einen formalen Beweis zu bieten, lediglich eine Aufzählung von Fällen:

  1. Wenn die beiden Knoten in verschiedenen Unterstrukturen gelöscht werden soll, dann Deletion von einem beeinflusst nicht die andere. Erst wenn sie möglicherweise in dem gleichen Weg kann die Reihenfolge der Löschung sind das Ergebnis beeinflussen.

    So eine Wirkung auf commutativity kann nur kommen, wenn ein Vorfahre Knoten und einer seiner Nachkommen sind beide gelöscht. Nun, wie sie ihre vertikale Beziehung commutativity beeinflussen?

  2. Nachkomme im linken Unterbaum des Vorfahren. Diese Situation wirkt sich nicht auf commutativity weil der Nachfolger von dem rechten Unterbaum kommt und kann den linken Unterbaum überhaupt nicht beeinflussen.

  3. Nachkomme im rechten Teilbaum der Vorfahren. Wenn der Nachfolger des Vorfahren immer der kleinste Knoten im rechten Teilbaum ist, dann Reihenfolge der Löschung kann nicht die Wahl des Nachfolgers ändern, egal was Nachkomme vor oder nach dem Vorfahren gelöscht. Auch wenn der Nachfolger des Vorfahren stellt sich heraus , den Nachkommen Knoten zu sein , die ebenfalls gelöscht werden soll auch , dass Nachkomme mit dem nächstgrößten Knoten , um es ersetzt wird, und dass Nachkomme nicht seinen eigener linker Teilbaum haben noch behandelt werden . So Löschung eines Vorfahren und jeder rechten Unterbaum Nachkommen immer kommutativ sein.

Beantwortet am 06/04/2011 um 19:34
quelle vom benutzer

stimmen
0

Ich denke , es gibt zwei gleich gangbare Wege einen Knoten zu löschen, wenn sie 2 Kinder hat:
SKIP TO FALL 4 ...

Fall 1: löschen 3 (Blattknoten)
 2 3
 / \ -> / \
1 3 1


Fall 2: löschen 2 (linkes Kind - Knoten)
 2 3
 / \ -> / \
1 3 1


Fall 3: löscht 2 (rechter Kindknoten)
 2 2
 / \ -> / \
1 3 3

______________________________________________________________________
Fall 4: löschen 2 (Left & Right Kind - Knoten)
 2 2 3
 / \ -> / \ oder / \      
1 3 1 3
Arbeit und haben unterschiedliche resultierende Bäume :) ______________________________________________________________________
Als Algorithmus hier erklärt: http: // www .mathcs.emory.edu / ~ cheung / Kurse / 323 / Syllabus / Bäume / AVL-delete.html Deleting a node with 2 children nodes: 1) Replace the (to-delete) node with its in-order predecessor or in-order successor 2) Then delete the in-order predecessor or in-order successor

Beantwortet am 10/10/2016 um 01:02
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more