Les arbres de recherche binaires équilibrés sont essentiels pour garantir les recherches O (log n) (ou opérations similaires). Dans un environnement dynamique où de nombreuses clés sont insérées et / ou supprimées au hasard, les arbres peuvent dégénérer en listes liées qui sont horribles pour les recherches. Il existe donc différents types d' arbres binaires à équilibrage automatique qui neutralisent cet effet (tels que les arbres AVL ou les arbres évasés ). Ces arbres sont basés sur différents types de rotations qui rééquilibrent l'arbre.
Rotations
Dans ce défi, nous ne regarderons que les rotations à droite simples, une telle rotation (la rotation à gauche serait symétrique) ressemble à ceci:
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
Si l'une des feuilles 1
, 4
ou 6
avait des sous-arbres gauche ou droit, une rotation les garderait simplement là. S'il s'agit d'un sous-arbre d'un arbre plus grand, nous devons simplement le «couper» au nœud 5
et «rattacher» l'arbre pivoté (maintenant le nœud 3
) à ce nœud.
Défi
Étant donné un arbre de recherche binaire 1 et une clé, tournez à droite l'arbre sur ce nœud comme décrit ci-dessus. La clé fournie dans l'exemple ci-dessus serait 5
.
Règles et E / S
- vous pouvez utiliser n'importe quel type de clé tant qu'il y a une bijection entre les clés de votre choix et celles des cas de test
- vous pouvez choisir n'importe quelle représentation pour les arbres binaires tant qu'il n'y a pas d'ambiguïté (par exemple,
[3,[]]
est ambigu sauf indication contraire) et c'est naturel pour la langue de votre choix - comme l'entrée sera toujours un arbre de recherche binaire, il n'y a pas de clés en double
- vous pouvez supposer que la clé est contenue dans l'arborescence
- vous pouvez supposer que le nœud contenant la clé a un enfant gauche
- vous ne pouvez pas supposer un sous-arbre droit sous la clé fournie
- vous ne pouvez pas supposer que l'arbre est déséquilibré avant la rotation
- vous ne pouvez pas supposer que l'arbre est équilibré après la rotation
- vous pouvez utiliser n'importe quelle méthode d'E / S par défaut
- votre soumission peut être une fonction renvoyant l'arborescence ou un programme complet imprimant la solution
Cas de test
Ces exemples représentent un arbre comme suit
- si c'est une feuille:
[]
- si c'est un arbre avec clé
x
et que les deux sous-arbres sont des feuilles:[x]
- si c'est un arbre avec clé
x
et sous-arbresleft
right
:[x,left,right]
Le premier exemple est celui fourni dans la section Rotations . Si pour une raison quelconque , vous avez besoin d' une représentation graphique d'entre eux, ici 2 vous allez.
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: ce qui signifie que pour tout noeud, toutes les clés du sous-arbre gauche seront plus petites que cette clé et toutes les clés du sous-arbre droit seront plus grandes que
2: pour éviter la pourriture des liens, je les ai intégrés en tant que commentaire
data B=B[B]Int
permettrait d'économiser quelques octets supplémentaires.