В Haskell, как создать идеально сбалансированное бинарное дерево поиска?

голоса
3

Функция должна принимает список хз и создает сбалансированное бинарное дерево поиска, состоящее из того же набора элементов как хз.

Результат должен быть таким: (если список [1,2,3,4,5,6,7,8])

Узел (Node (узел (узел 1 Пустой Пустой) 2 Пустой) 4 (4 Узел Пустой Пустой)) 5 (Узел (Node Пустой 6 Пустой) 7 (Узел 8 Пустой Пустой))

то есть дерево должно выглядеть следующим образом:

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

а не это:

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

Может кто-нибудь сказать мне, как это сделать? Я считаю, что я могу сделать второе дерево, которое не является идеально сбалансированным, но не знаю, как сделать первый.

Я признателен за любую помощь !! Заранее спасибо!

Задан 30/09/2013 в 09:56
источник пользователем
На других языках...                            


2 ответов

голоса
7

Сортировка списка ввода. Теперь создаст дерево, корневой узел является средним элементом списка, и, левого и правых поддерева поддерев, порождаемого применения этого процесса подсписков слева и справа от центра, соответственно.

В 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))
Ответил 30/09/2013 в 10:06
источник пользователем

голоса
0

Если в верхней части дерева должно быть средний элемент:

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'

Если не:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Ответил 01/10/2013 в 23:56
источник пользователем

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