Haskell, nasıl mükemmel dengeli bir ikili arama ağacı oluşturmak için?

oy
3

Bir liste xs alır ve xs elemanların tam olarak aynı setinden oluşan dengeli bir ikili arama ağacı oluşturur gerektiği fonksiyonu.

Sonuç aşağıdaki gibi olması gerekir: (liste ise [1,2,3,4,5,6,7,8])

Düğüm (düğüm (düğüm (düğüm Boş 1 Boş) 2 Boş) 4 (Düğüm Boş 4 boş)) 5 (düğüm (düğüm Boş 6 Boş) 7 (Düğüm Boş 8 boş))

o ağaç gibi görünmelidir ki:

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

yerine bu:

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

Herkes bunun nasıl yapılacağını söyleyebilir misiniz? Ben mükemmel dengeli değildir ikinci ağacı yapabilir bulmak, ama ilkini nasıl bilmiyorum.

Herhangi bir Yardım takdir !! Şimdiden teşekkür ederim!

Oluştur 30/09/2013 saat 09:56
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
7

giriş sıralandırır. Şimdi kimin kök düğüm sol ve sağ alt ağaç sırasıyla merkezin solunda ve sağında sublists için bu işlemi uygulanarak üretilen alt ağaçlar olan orta listenin eleman ve bir ağaç oluşturmak.

Haskell'de:

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))
Cevap 30/09/2013 saat 10:06
kaynak kullanıcı

oy
0

Ağacın üst orta eleman olması gerekiyorsa:

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'

Değilse:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Cevap 01/10/2013 saat 23:56
kaynak kullanıcı

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