Gli alberi di ricerca binaria bilanciata sono essenziali per garantire ricerche O (log n) (o operazioni simili). In un ambiente dinamico in cui molte chiavi vengono inserite e / o eliminate in modo casuale, gli alberi potrebbero degenerare in elenchi collegati che sono orribili per le ricerche. Quindi ci sono vari tipi di alberi binari autobilanciati che contrastano questo effetto (come alberi AVL o alberi di splay ). Questi alberi si basano su diversi tipi di rotazioni che riequilibrano l'albero.
rotazioni
In questa sfida vedremo solo singole rotazioni a destra, tale rotazione (la rotazione a sinistra sarebbe simmetrica) è simile a questa:
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
Se una qualsiasi delle foglie 1
, 4
o 6
avesse sotto-alberi sinistro o destro, una rotazione li avrebbe semplicemente tenuti lì. Se questa è una sottostruttura di un albero più grande, avremmo semplicemente "tagliato" sul nodo 5
e "ricollegato" l'albero ruotato (ora nodo 3
) a quel nodo.
Sfida
Dato un albero di ricerca binario 1 e una chiave, ruota a destra l'albero su quel nodo come descritto sopra. La chiave fornita nell'esempio sopra sarebbe 5
.
Regole e I / O
- è possibile utilizzare qualsiasi tipo di chiave purché vi sia una biiezione tra le chiavi di propria scelta e quelle dei casi di test
- puoi scegliere qualsiasi rappresentazione per alberi binari purché non ci siano ambiguità (ad es.
[3,[]]
è ambigua se non diversamente specificato) ed è naturale per la tua lingua preferita - poiché l'input sarà sempre un albero di ricerca binario non ci sono chiavi duplicate
- puoi presumere che la chiave sia contenuta nell'albero
- si può presumere che il nodo contenente la chiave abbia un figlio sinistro
- si può non assumere una sottostruttura proprio sotto la chiave fornita
- si può non dare per scontato che l'albero è sbilanciato, prima della rotazione
- si può non pensare che l'albero è bilanciato dopo la rotazione
- è possibile utilizzare qualsiasi metodo I / O predefinito
- l'invio può essere una funzione che restituisce l'albero o il programma completo che stampa la soluzione
Casi test
Questi esempi rappresentano un albero come segue
- se è una foglia:
[]
- se è un albero con chiave
x
ed entrambi i sottotitoli sono foglie:[x]
- se è un albero con chiave
x
e sottotitolileft
right
:[x,left,right]
Il primo esempio è quello fornito nella sezione Rotazioni . Se per qualche motivo hai bisogno di una rappresentazione grafica di loro, qui 2 vai.
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: significa che per ogni nodo tutte le chiavi nella sottostruttura sinistra saranno più piccole di quella chiave e tutte le chiavi nella sottostruttura destra sono maggiori di essa
2: per impedire il collegamento del rot, li ho incorporati come commento
data B=B[B]Int
risparmierebbe qualche altro byte.