Dans Haskell, comment générer un arbre de recherche binaire parfaitement équilibrée?

voix
3

La fonction doit prend une liste xs et construit un arbre de recherche binaire équilibré composé d'exactement le même ensemble d'éléments que xs.

Le résultat devrait être comme ceci: (si la liste est [1,2,3,4,5,6,7,8])

Node (noeud (Node (noeud vide vide 1) 2 Vide) 4 (4 noeud vide vide)) 5 (Node (noeud vide vide 6) 7 (noeud vide vide 8))

c'est-à-dire l'arbre devrait ressembler à ceci:

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

plutôt que ceci:

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

Quelqu'un pourrait me dire comment faire? Je trouve que je peux faire le deuxième arbre qui est pas parfaitement équilibrée, mais je ne sais pas comment faire le premier.

Je vous remercie de toute aide !! Merci d'avance!

Créé 30/09/2013 à 09:56
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
7

Trier la liste d'entrée. Maintenant créer un arbre dont le nœud racine est l'élément central de la liste, et dont les sous-arbres gauche et à droite sont les sous-arbres générés par l'application de ce procédé aux sous-listes à gauche et à droite du centre, respectivement.

En Haskell:

buildBalanced []   = Empty
buildBalanced elts = Node (buildBalanced $ take half elts) 
                          (elts !! half) 
                          (buildBalanced $ drop (half+1) elts)
    where half = length elts `quot` 2

main = putStrLn $ show $ buildBalanced [1,2,3,4,5,6,7,8]
-- prints Node (Node (Node (Node Empty 1 Empty) 2 Empty) 3 (Node Empty 4 Empty)) 5 (Node (Node Empty 6 Empty) 7 (Node Empty 8 Empty))
Créé 30/09/2013 à 10:06
source utilisateur

voix
0

Si le haut de l'arbre doit être l'élément central:

mkBalanced [] = Empty
mkBalanced xs = Node mid (mkBalanced half0) (mkBalanced half1)
    where (half0, half') = splitAt ((length xs `div` 2) - 1) xs
          half1 = tail half'
          mid = head half'

Si non:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Créé 01/10/2013 à 23:56
source utilisateur

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