Ausgeglichene binäre Suchbäume sind wichtig, um O (log n) -Nachschauen (oder ähnliche Operationen) zu gewährleisten . In einer dynamischen Umgebung, in der viele Schlüssel nach dem Zufallsprinzip eingefügt und / oder gelöscht werden, können Bäume zu verknüpften Listen ausarten, die für Nachschlagezwecke schrecklich sind. Daher gibt es verschiedene Arten von sich selbst ausgleichenden Binärbäumen, die diesem Effekt entgegenwirken (z. B. AVL-Bäume oder Splay-Bäume ). Diese Bäume basieren auf verschiedenen Arten von Rotationen , die den Baum wieder ins Gleichgewicht bringen.
Drehungen
In dieser Herausforderung werden nur einzelne Rechtsdrehungen betrachtet. Eine solche Drehung (Linksdrehung wäre symmetrisch) sieht folgendermaßen aus:
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
Wenn eines der Blätter 1
, 4
oder 6
verlassen hatte oder rechten Teilbäume wäre eine Drehung einfach halten sie dort. Wenn dies ein Teilbaum eines größeren Baums ist, würden wir ihn einfach am Knoten "abschneiden" 5
und den gedrehten Baum (jetzt Knoten 3
) an diesen Knoten "anhängen" .
Herausforderung
Wenn ein binärer Suchbaum 1 und ein Schlüssel gegeben sind, drehen Sie den Baum auf diesem Knoten nach rechts, wie oben beschrieben. Der im obigen Beispiel angegebene Schlüssel wäre 5
.
Regeln und I / O
- Sie können einen beliebigen Schlüsseltyp verwenden, solange zwischen den Schlüsseln Ihrer Wahl und den Schlüsseln der Testfälle ein Unterschied besteht
- Sie können eine beliebige Darstellung für Binärbäume auswählen,
[3,[]]
sofern keine Mehrdeutigkeit vorliegt (z. B. ist sie mehrdeutig, sofern nicht anders angegeben) und dies für die Sprache Ihrer Wahl natürlich ist - da die Eingabe immer ein binärer Suchbaum ist, gibt es keine doppelten Schlüssel
- Sie können davon ausgehen, dass der Schlüssel im Baum enthalten ist
- Sie können davon ausgehen, dass der Knoten, der den Schlüssel enthält, ein linkes Kind hat
- Sie können keinen rechten Teilbaum unter dem angegebenen Schlüssel annehmen
- Sie können nicht davon ausgehen, dass der Baum vor der Drehung aus dem Gleichgewicht geraten ist
- Sie können nicht davon ausgehen, dass der Baum nach der Drehung ausgeglichen ist
- Sie können eine beliebige Standard-E / A-Methode verwenden
- Ihre Eingabe kann eine Funktion sein, die den Baum zurückgibt, oder ein vollständiges Programm, das die Lösung druckt
Testfälle
Diese Beispiele stellen einen Baum wie folgt dar
- Wenn es ein Blatt ist:
[]
- Wenn es sich um einen Baum mit Schlüssel handelt
x
und beide Teilbäume Blätter sind:[x]
- Wenn es sich um einen Baum mit Schlüssel
x
und Teilbäumen handeltleft
right
:[x,left,right]
Das erste Beispiel finden Sie im Abschnitt Rotationen . Wenn Sie aus irgendeinem Grund eine grafische Darstellung benötigen, klicken Sie hier 2 .
5 [5,[3,[1],[4]],[6]] -> [3,[1],[5,[4],[6]]]
5 [5,[3,[1],[4]],[]] -> [3,[1],[5,[4],[]]]
5 [5,[3,[],[4]],[6]] -> [3,[],[5,[4],[6]]]
5 [5,[3,[1],[]],[]] -> [3,[1],[5]]
4 [8,[4,[2,[1],[3]],[6,[5],[7]]],[12,[10,[9],[11]],[14,[13],[15]]]] -> [8,[2,[1],[4,[3],[6,[5],[7]]]],[12,[10,[9],[11]],[14,[13],[15]]]]
8 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [10,[6,[4,[2,[],[3]],[5]],[8,[7],[9]]],[11]]
10 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [8,[6,[4,[2,[],[3]],[5]],[7]],[10,[9],[11]]]
9 [6,[3,[2],[5]],[9,[8],[12,[11],[15,[14],[]]]]] -> [6,[3,[2],[5]],[8,[],[9,[],[12,[11],[15,[14],[]]]]]]
7 [7,[5,[3,[1],[4]],[6]],[8]] -> [5,[3,[1],[4]],[7,[6],[8]]]
15 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[13,[11,[10],[12]],[15,[14],[16]]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
21 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[19,[18],[21,[20],[24,[22],[25]]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
1: Dies bedeutet, dass für jeden Knoten alle Schlüssel im linken Teilbaum kleiner als dieser Schlüssel sind und alle Schlüssel im rechten Teilbaum größer als dieser Schlüssel sind
2: um link-rot zu verhindern, habe ich sie als kommentar eingebettet
data B=B[B]Int
die Verwendung von würden weitere Bytes eingespart.