Une façon de penser à ce problème est d'utiliser le fait qu'une promenade envue de l'arbre produira tous les éléments dans l'ordre. Si vous pouvez détecter les écarts de l'ordre de tri cours de cette promenade, vous pouvez essayer de localiser les deux éléments qui sont au mauvais endroit.
Voyons voir comment faire cela pour un simple tableau trié, puis utilisera notre algorithme pour construire quelque chose qui fonctionne sur les arbres. Intuitivement, si nous commençons avec un tableau trié puis échanger deux éléments (non égaux!), Nous finirons avec un certain nombre d'éléments du tableau étant hors de propos. Par exemple, étant donné le tableau
1 2 3 4 5
Si nous échangeons des 2 et 4, nous nous retrouvons avec ce tableau:
1 4 3 2 5
Comment pourrions-nous détecter 2 et 4 ont été échangés ici? Eh bien, puisque 4 est la plus grande des deux éléments et a été échangé vers le bas, il devrait être supérieur à la fois des éléments autour de lui. De même, parce que 2 a été échangé, il devrait être plus petit que les deux éléments autour d'elle. De là, nous pourrions conclure que 2 et 4 ont été permutées.
Cependant, cela ne fonctionne pas toujours correctement. Par exemple, supposons que nous échangeons 1 et 4:
4 2 3 1 5
Ici, à la fois 2 et 1 sont plus petits que leurs éléments voisins, et les deux 4 et 3 sont plus grandes que les leurs. De cela, nous pouvons dire que deux de ces quatre ont été en quelque sorte troqué, mais on ne sait pas quels sont ceux que nous devrions échanger. Cependant, si l'on prend la plus grande et la plus petite de ces valeurs (1 et 4, respectivement), on finit par obtenir la paire qui a été échangé.
De manière plus générale, de trouver les éléments qui ont été échangés dans la séquence, vous voulez trouver
- Le plus grand maximum local dans le tableau.
- Le minimum local le plus petit dans le tableau.
Ces deux éléments sont hors de place et doivent être permutés.
Maintenant, nous allons réfléchir à la façon de l'appliquer à des arbres. Depuis une promenade infixe de l'arbre produira la séquence triée avec les deux éléments sur commande, une option serait de marcher l'arbre, l'enregistrement de la séquence envue d'éléments que nous avons trouvé, en utilisant l'algorithme ci-dessus. Par exemple, pensez à votre BST d'origine:
20
/ \
15 30
/ \ / \
10 17 25 33
/ | / \ / \ | \
9 16 12 18 22 26 31 34
Si nous linéarisons cela dans un tableau, nous obtenons
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
Notez que 16 est plus grande que ses éléments qui l'entourent et qui 12 est inférieure à sa. Cela nous dit immédiatement que 12 et 16 ont été permutées.
Un algorithme simple pour résoudre ce problème, donc, serait de faire une promenade envue de l'arbre à linéariser dans une séquence comme une vectorou deque, puis à analyser cette séquence pour trouver le plus grand maximum local et le minimum local plus petit. Cela irait dans O (n), en utilisant l' espace O (n). Un plus délicat mais plus algorithme efficace espace serait seulement garder une trace de trois nœuds à un moment - le nœud actuel, son prédécesseur et son successeur - ce qui réduit l'utilisation de la mémoire à O (1).
J'espère que cela t'aides!