Rama más corta en un árbol binario

votos
1

Un árbol binario se puede codificar usando dos funciones ly de r manera que para a node n, l(n)dar el hijo izquierdo de n, r(n) dar el hijo correcto de n.

Una rama de un árbol es un camino desde la raíz hasta una hoja, la longitud de una rama a una hoja en particular es la cantidad de arcos en la ruta desde la raíz hasta esa hoja.

Sea MinBranch(l,r,x)un algoritmo recursivo simple para tomar un árbol binario codificado por las funciones l y r junto con el nodo raíz x para el árbol binario y devuelve la longitud de la rama más corta del árbol binario.

Da el pseudocódigo para este algoritmo.

OK, básicamente esto es lo que he propuesto hasta ahora:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

Obviamente esto no es genial ni perfecto. Me gustaría mucho si la gente puede ayudarme a que esto sea perfecto y funcione; cualquier ayuda será apreciada.

Publicado el 28/08/2009 a las 05:07
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
3

Dudo que alguien te resuelva la tarea directamente. Una pista: el valor de retorno seguramente debe crecer a medida que el árbol crezca, ¿no? Sin embargo, no veo ningún literal numérico en su función excepto 0, y tampoco operadores de suma. ¿Cómo devolverás números más grandes?

Otro punto de vista sobre el mismo tema: cada vez que escribes una función recursiva, es útil enumerar "¿cuáles son todas las condiciones en las que debo dejar de llamarme a mí mismo? ¿Qué devuelvo en cada circunstancia?"

Respondida el 28/08/2009 a las 05:15
fuente por usuario

votos
2

Estás en el enfoque correcto, pero no estás del todo allí; su algoritmo recursivo siempre devolverá 0. (la lógica es casi correcta, sin embargo ...)

tenga en cuenta que la longitud de las ramas secundarias es una menos que la longitud de la rama; así left_oney right_onedebe ser 1 + MinBranch....

Pasar por el algoritmo con algunos árboles de muestra ayudará a descubrir errores uno a uno como este ...

Respondida el 28/08/2009 a las 05:16
fuente por usuario

votos
0

Lo que has creado puede considerarse una búsqueda en profundidad. Sin embargo, dado lo que está buscando (rama más corta), este puede no ser el enfoque más eficiente. Piensa en cómo funcionaría tu algoritmo en un árbol que era muy pesado en el lado izquierdo (del nodo raíz), pero que tenía solo un nodo en el lado derecho.

Sugerencia: considere un enfoque de búsqueda de amplitud.

Respondida el 28/08/2009 a las 05:19
fuente por usuario

votos
0

Lo que tienes allí parece un primer algoritmo de búsqueda en profundidad que tendrá que buscar en todo el árbol antes de llegar a una solución. lo que necesita es el primer algoritmo de búsqueda que puede regresar tan pronto como encuentre la solución sin hacer una búsqueda completa

Respondida el 28/08/2009 a las 05:19
fuente por usuario

votos
1

Parece que casi lo tienes, pero considera este ejemplo:

      4

   3     5

Cuando rastree MinBranch, verá eso en su MinBranch(l,r,4)llamada:

left_one = MinBranch(l, r, l(x))
         = MinBranch(l, r, l(4))
         = MinBranch(l, r, 3)
         = 0

Eso tiene sentido, después de todo, 3 es un nodo de hoja, por lo que la distancia al nodo de hoja más cercano es 0. Lo mismo sucede con right_one.

Pero luego terminas aquí:

return {min (left_one),(right_one)}
     = {min (0), (0) }
     = 0

pero eso está claramente mal, porque este nodo (4) no es un nodo hoja. Tu código olvidó contar el nodo actual (¡Uy!). Estoy seguro de que puedes arreglar eso.


Ahora, de hecho, la manera en que lo haces no es la más rápida, pero no estoy seguro de si eso es relevante para este ejercicio. Considera este árbol:

         4
       3   5
     2
   1

Su algoritmo contará recursivamente la rama izquierda, aunque podría, hipotéticamente, rescatar si primero contó la rama derecha y notó que 3 tiene una izquierda, por lo que es claramente más larga que 5 (que es una hoja). Pero, por supuesto, ¡contar primero la rama correcta no siempre funciona!

En cambio, con un código más complicado, y probablemente una compensación de mayor uso de memoria, puede verificar los nodos de izquierda a derecha, de arriba hacia abajo (al igual que el orden de lectura en inglés) y detenerse en la primera hoja que encuentre.

Respondida el 28/08/2009 a las 05:20
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more