Hay muchas soluciones sobre cómo encontrar las claves inferiores y superiores más cercanas en el árbol binario en lenguajes imperativos, pero faltan las mismas preguntas para hacerlo en un estilo puramente funcional como el de Haskell. Tengo curiosidad por saber cómo es posible caminar alrededor de un árbol de búsqueda binario antes de encontrar las dos claves más cercanas. Hay una función y algunas coincidencias de patrones que tengo hasta ahora:
data TreeMap v = Leaf | Node { pair::(Integer, v), l::TreeMap v, r::TreeMap v} deriving (Show, Read, Eq, Ord)
closestLess :: Integer -> TreeMap v -> (Integer, v)
closestLess i Leaf = error "Tree doesn't include any element"
closestLess i (Node pair tree_r tree_l)
| i < fst pair = closestLess i tree_l
| i == fst pair = closestLess i tree_r
| otherwise = precise i pair tree_r
Utilizo esta función para obtener una clave más baja, pero más cercana a un argumento Integer. En mi opinión, no hay nada más que la necesidad de implementar alguna función auxiliar como "precisa", aunque estoy confundido sobre qué definición necesita exactamente. Mi sugerencia es poner ese valor entero, nodo en el subárbol derecho "preciso" también para encontrar cualquier clave que esté más cerca del objetivo. Por lo tanto, también tendría algunos consejos o suposiciones sobre cómo hacerlo para las teclas inferiores y superiores.