¿Por qué el algoritmo transversal de Morris tiene una complejidad de tiempo O (n)?

Cada borde se atraviesa como máximo 3 veces y hay n-1 bordes en un árbol, de ahí el O (n).

Creo que la parte que te confunde es el bucle de búsqueda predecesor porque baja por el árbol que sigue al nodo más a la derecha.

/* Find the inorder predecessor of current */ pre = current->left; while (pre->right != NULL && pre->right != current) pre = pre->right; 

Esta ruta completa solo se procesa dos veces:

  1. cuando el puntero actual llega al nodo
  2. cuando hemos procesado su subárbol izquierdo

Además, la clave es que esta ruta no se procesa nuevamente mientras estamos en el subárbol izquierdo.

Quizás un árbol más grande lo aclare.

  .  1
    / \ 
   2 3
  / \
 4 5
    / \
   6 7

Actual es 1

  • Encuentre el predecesor (pred) de 1. Comience en 2, bordes transversales 2 -> 5 -> 7.
  • Nodo 7 -> puntos correctos a 1

La corriente es 2

  • Encuentre el pred de 2. Comience a las 4 y termine de inmediato.
  • 4 -> derecha = 2

La corriente es 4

  • No pred, print 4. current-> right is 2

Current es 2 otra vez

  • Encuentre pred de 2. Comience a las 4 y termine de inmediato.
  • 4 -> right es 2, que agregamos antes. bórrelo, imprima 2 y muévase a 2-> derecha

La corriente es 5

  • Encuentra pref de 5. Es 6
  • 6 -> derecha = 5

La corriente es 6

  • Sin pred, imprimir 6. actual-> derecha es 5

Current es 5 otra vez

  • Igual que con 2. Encuentra 6, borra 6-> a la derecha, imprime 5 y pasa a 7

La corriente es 7

  • Sin pred, imprime 7 y muévete a 7 -> derecha, que es 1

Current es 1 otra vez

  • Encuentre la preferencia de 1. Bordes transversales 2 -> 5 -> 7. Dado que 7-> a la derecha es 1, imprima 1, muévase a 3

La corriente es 3

  • Imprimir 3

Como dije, observe que la ruta 1 -> 2 -> 5 -> 7 solo se calcula dos veces. Cuando nos movemos en el subárbol izquierdo del nodo 1, lo atravesamos pero solo 1 borde a la vez. Entonces cada borde se atraviesa como máximo 3 veces.

More Interesting

¿Es más difícil probar la corrección de algoritmos codiciosos que probar la corrección de cualquier otra clase de algoritmos?

¿Son factibles los problemas NP-difíciles?

¿Cuál es el enfoque algorítmico para encontrar el primer entero positivo que falta si se proporciona una matriz entera sin clasificar en O (n) complejidad de tiempo y espacio constante?

¿Los estudiantes de pregrado de CS estadounidenses entienden todas las matemáticas en sus libros de texto conceptualmente?

¿Qué es una explicación intuitiva de inserción en un árbol AVL?

¿Las ventajas del arreglo lineal desaparecen si el arreglo es demasiado corto? ¿Por qué veo 4-6 cajas de cajas?

¿Cómo funciona el algoritmo de recomendación de películas de Netflix?

¿Cuál es el mejor algoritmo para girar a la izquierda en los semáforos?

¿Se utilizan las señales sociales en los algoritmos de clasificación de motores de búsqueda?

¿Deberíamos memorizar algoritmos, o simplemente saber cómo implementarlos?

¿Cómo se desarrollaron los algoritmos cuánticos?

¿Por qué recibo un error de tiempo de ejecución en la conversión de un árbol binario a un árbol binario enhebrado?

Cómo escribir un algoritmo para la suma de n factoriales. es decir, 1! +2! +3! +… (N-1) + n

Si un hombre está limitado por el conocimiento, ¿podemos crear un algoritmo para sus elecciones y determinar su futuro?

¿Necesitamos un algoritmo 10 veces más rápido o una máquina 10 veces más rápida? Da una razón para justificar tu respuesta.