Sortierte Reihenfolge der Zahlen von BST löschen

8

Ich hatte diese Frage während einer Prüfung und konnte keine schnelle Antwort finden.

Es gibt ein Array A mit einigen geordneten Zahlen A = [1,3,6,9,11] und ein BST mit Zahlen als Schlüssel. Ich muss einen effizienten rekursiven Algorithmus zur Verfügung stellen, um die Zahlen in A von der BST zu löschen.

Das Problem, das ich habe, ist nicht das Löschen der Knoten, sondern die Verwendung der Tatsache, dass das Array beim Löschen der Knoten geordnet ist.

Kann mir jemand mit einigen Tipps helfen?

    
JustB 01.09.2011, 10:28
quelle

2 Antworten

2

Hier ist ein möglicher Ansatz.

Sie könnten gleichzeitig sowohl die BST (mit dem rekursiven Standardalgorithmus ) als auch A (von links) durchqueren nach rechts). Jede der Durchquerungen ergibt Elemente in aufsteigender Reihenfolge. Sie suchen nach übereinstimmenden Elementen, um sie aus der Baumstruktur zu löschen.

Ein naive Algorithmus hat O(size(BST)) Zeitkomplexität.

In einigen Fällen können Sie es vermeiden, den linken Teilbaum vollständig zu betrachten: Der Wert des "aktuellen" Knotens im Baum gibt Ihnen eine obere Grenze für die Werte im linken Teilbaum, also wenn dieser kleiner ist als der Wert des "current" Element von A , überspringe den linken Teilbaum.

Sie können den Algorithmus auch stoppen, sobald Sie A erschöpft haben.

    
NPE 01.09.2011, 11:16
quelle
0

Lassen Sie eine BST durch ihren Wurzelknoten dargestellt werden.

Die Funktion delete-array-from-bst mit den Argumenten array und bst ist:

  • wenn array oder bst leer ist: return
  • teilt das Array in drei Subarrays auf, wobei die Werte kleiner, gleich und größer als der Wurzelknotenwert% /% des Co_de% sind
  • rekursiere auf dem Subarray mit den kleineren Werten mit dem linken Sub-BST, dann auf dem Subarray mit den größeren Werten auf dem rechten Sub-BST, lösche schließlich den gleichen Wert, falls anwendbar

Das Teilen des Arrays ist eine binäre Suche, so dass Sie nicht jeden Array-Wert mit dem Root-Knoten vergleichen müssen. Die Subarrays können die Struktur mit dem ursprünglichen Array teilen. Wenn Sie den gleichen Wert zuletzt löschen, wird sichergestellt, dass Sie nicht die schlechteste Löschbedingung für jeden Wert im Array treffen.

    
Svante 01.09.2011 11:46
quelle

Tags und Links