Utilidad del recorrido pre y post orden de árboles binarios

13

Esto puede ser muy ingenuo, pero me preguntaba, el contexto de los árboles binarios (simples, ordenados y equilibrados), de todos los tipos transversales:

  • profundidad de pre-orden
  • profundidad primero en orden
  • profundidad de primer pedido
  • ancho primero

¿Cuál es la utilidad real de los pre y post orden? Quiero decir, ¿hay algún tipo y / o configuración de árbol binario en el que el recorrido previo y / o posterior al pedido daría (alguna) ventaja (s) sobre los otros dos?

AFAICS, hay ciertos tipos y configuraciones de árboles binarios para los cuales, en orden y amplitud, pueden dar cierta ventaja:

  • para un árbol binario equilibrado, cualquier recorrido de profundidad primero usará menos espacio de almacenamiento de memoria en comparación con la amplitud primero (por ejemplo, para un árbol binario equilibrado de 6 o 7 nodos, la altura es 2, por lo que cualquier recorrido de profundidad primero necesitará almacenar un máximo de 2 nodos en un momento dado, mientras que el último nivel tiene 3 o 4 nodos, por lo que el recorrido transversal primero necesitaría almacenar hasta 3 o 4 nodos en algún momento). En este caso, el uso del recorrido en orden utiliza la menor cantidad de memoria y visita los nodos en su orden natural.

  • para un árbol binario no equilibrado, si está cerca del peor escenario de inserción, atravesarlo primero en amplitud usaría menos memoria en comparación con cualquiera de los primeros recorridos en profundidad. Entonces, en este caso, la amplitud ofrece una ventaja. El recorrido en orden tiene nuevamente la ventaja de visitar valores en su orden natural.

Sin embargo, no puedo pensar en una situación en la que antes y después del recorrido darían una ventaja sobre los otros dos.

Shivan Dragon
fuente

Respuestas:

13

Debe hacer varias cosas con árboles, como traducir entre la estructura de datos y alguna representación en serie, como en un archivo o en un idioma.

Entonces, por ejemplo, suponga que tiene un árbol de análisis como este:

    *
   / \
  +   \
 / \   \
A   B   C

Puede serializarlo * + A B Ccaminando en orden de prefijo, o A B + C *caminando en orden de postfijo. Si trabaja en absoluto con procesadores de lenguaje, tales cosas deben ser de segunda naturaleza.

Mike Dunlavey
fuente
Muy buen ejemplo! Y tenga en cuenta cómo rendiría el recorrido en orden A + B * C, que es mucho más fácil de entender para los usuarios normales que cualquier prefijo de orden postfix.
Kilian Foth
3
@KilianFoth, excepto que eso no es lo que dice el árbol: dice (A + B) * C, al menos para mis ojos. Aunque mis dedos HP-28 como la versión AB + C * están bien. :-)
sdg
@Kilian: SDG tiene razón. Con inorder, debe preocuparse por la precedencia, a menos que ponga paréntesis en todo.
Mike Dunlavey
13

El artículo de wikipedia tiene una buena descripción concisa de cuándo desea utilizar los diferentes tipos de búsqueda en profundidad:

  • El pedido anticipado transversal mientras se duplican nodos y valores puede hacer una duplicación completa de un árbol binario. También se puede usar para hacer una expresión de prefijo (notación polaca) a partir de árboles de expresión: atraviese el árbol de expresión de forma ordenada.
  • El recorrido en orden se usa muy comúnmente en los árboles de búsqueda binarios porque devuelve los valores del conjunto subyacente en orden, de acuerdo con el comparador que configuró el árbol de búsqueda binario (de ahí el nombre).
  • El recorrido posterior al pedido al eliminar o liberar nodos y valores puede eliminar o liberar un árbol binario completo. También puede generar una representación postfix de un árbol binario.

Se reduce a las necesidades logísticas de un algoritmo. Por ejemplo, si no utiliza el recorrido de orden posterior durante la eliminación, pierde las referencias que necesita para eliminar los árboles secundarios.

Karl Bielefeldt
fuente
Wikipedia a partir del 10 de noviembre de 2019 cambió y la primera descripción también pertenece a Post-Order, lo cual es confuso. Esa es la razón por la que terminé aquí, buscando otra fuente de información.
Whoan
5

El punto de tener diferentes algoritmos para tratar con árboles binarios no es hacer cosas con árboles. En este nivel abstracto, un orden es en gran medida tan bueno como cualquier otro, ya que solo se obtienen símbolos abstractos del procedimiento.

Pero los árboles se usan típicamente para representar cosas interesantes, y eso puede hacer una gran diferencia en el resultado. Por ejemplo, si los nodos representan estados de búsqueda en una búsqueda completa a través de un gran dominio (tal vez incluso un dominio infinito), descender primero frente a procesar primero no solo determina en qué orden se encuentran los resultados, sino que incluso puede determinar si alguna vez encuentre cualquier solución en absoluto . El punto es más fácil de ver con dominios infinitos: si desciendes con cautela, podrías pasar por alto una solución que se encuentra bastante arriba en el árbol, simplemente porque tomaste un giro equivocado. Pero en la práctica, dado que la memoria y los discos también son finitos, esto incluso se aplica a dominios que son simplemente muy grandes en lugar de realmente infinitos.

Kilian Foth
fuente