În Haskell, cum de a genera un arbore perfect echilibrat binar de căutare?

voturi
3

Funcția trebuie să ia o listă Xs, și construiește un arbore binar de căutare echilibrat format din exact același set de elemente ca xs.

Rezultatul ar trebui să fie ca aceasta: (în cazul în care lista este [1,2,3,4,5,6,7,8])

Nod (Node (nod (Nod gol 1 Gol) 2 Gol) 4 (Nod gol 4 Gol)) 5 (Nod (Node Gol 6 Gol) 7 (Node Gol 8 Gol))

adică copac ar trebui să arate astfel:

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

mai degrabă decât aceasta:

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

Ar putea cineva să-mi spui cum să fac acest lucru? Mi se pare că pot face al doilea copac, care nu este perfect echilibrat, dar nu știu cum să facă primul.

Apreciez orice ajutor !! Multumesc anticipat!

Întrebat 30/09/2013 la 09:56
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
7

Sortați lista de intrare. Acum, creați un copac al cărui nod rădăcină este elementul de mijloc al listei, și a cărui subarbori stânga și dreapta sunt subramificații generate prin aplicarea acestui procedeu la Sublistele la stânga și la dreapta de centru, respectiv.

În 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))
Publicat 30/09/2013 la 10:06
sursa de către utilizator

voturi
0

În cazul în care partea de sus a arborelui trebuie să fie elementul de mijloc:

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'

Dacă nu:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Publicat 01/10/2013 la 23:56
sursa de către utilizator

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