Una manera de pensar acerca de este problema es utilizar el hecho de que un paseo a finde del árbol producirá todos los elementos en el orden establecido. Si se puede detectar desviaciones de la forma ordenada durante este paseo, se puede tratar de localizar a los dos elementos que están en el lugar equivocado.
Vamos a ver cómo hacer esto por una simple matriz ordenada inicialmente, y luego utilizar nuestro algoritmo para construir algo que funciona en los árboles. Intuitivamente, si partimos de una matriz ordenada y luego intercambiar dos (!) No iguales elementos, vamos a terminar con un número de elementos de la matriz de estar fuera de lugar. Por ejemplo, dada la matriz
1 2 3 4 5
Si cambiar 2 y 4, terminamos con esta matriz:
1 4 3 2 5
¿Cómo podemos detectar que 2 y 4 fueron intercambiados aquí? Bueno, ya que 4 es el mayor de los dos elementos y se intercambiados hacia abajo, debe ser mayor que ambos elementos de su alrededor. Del mismo modo, porque 2 se canjearon hacia arriba, que debe ser más pequeño que los dos elementos a su alrededor. A partir de esto, podemos concluir que 2 y 4 fueron intercambiadas.
Sin embargo, esto no siempre funciona correctamente. Por ejemplo, supongamos que cambiamos 1 y 4:
4 2 3 1 5
Aquí, tanto 2 y 1 son más pequeñas que sus elementos vecinos, y ambos 4 y 3 son más grandes que el de ellos. De esto podemos decir que dos de estos cuatro fueron cambiados de alguna manera, pero no es claro cuáles debemos intercambiar. Sin embargo, si tomamos el más grande y el más pequeño de estos valores (1 y 4, respectivamente), terminamos encima de conseguir el par que se va a intercambiar.
De manera más general, para encontrar los elementos que fueron cambiados en la secuencia, que desea buscar
- El mayor máximo local de la matriz.
- El mínimo local más pequeño en la matriz.
Estos dos elementos están fuera de lugar y deben ser cambiados.
Ahora, vamos a pensar en cómo aplicar esto a los árboles. Desde un paseo finde del árbol producirá la secuencia ordenada con los dos elementos fuera de servicio, una opción sería la de recorrer el árbol, la grabación de la secuencia finde de elementos que hemos encontrado, a continuación, utilizando el algoritmo anterior. Por ejemplo, considere su BST originales:
20
/ \
15 30
/ \ / \
10 17 25 33
/ | / \ / \ | \
9 16 12 18 22 26 31 34
Si nos linealizar esta en una matriz, obtenemos
9 10 16 15 12 17 18 20 22 25 26 30 31 33 34
Observe que 16 es mayor que sus elementos circundantes y que 12 es menor que su. Esto nos dice inmediatamente que el 12 y 16 fueron intercambiadas.
Un algoritmo sencillo para resolver este problema, por lo tanto, sería hacer un paseo a finde del árbol para linealizar en una secuencia como una vectoro deque, a continuación, para analizar esa secuencia para encontrar el mayor máximo local y el mínimo local más pequeño. Esto iría en en tiempo O (n), usando O espacio (n). Un algoritmo eficiente con el espacio más complicado pero más sería solamente un seguimiento de tres nodos a la vez - el nodo actual, su predecesor, y su sucesor - que reduce el uso de memoria a O (1).
¡Espero que esto ayude!