In Haskell, wie einen perfekt ausgewogenen binären Suchbaum zu generieren?

stimmen
3

Die Funktion sollte eine Liste xs und konstruiert einen ausgewogenen binären Suchbaum nimmt das aus genau dem gleichen Satz von Elementen als xs.

Das Ergebnis sollte so aussehen: (wenn die Liste [1,2,3,4,5,6,7,8])

Knoten (Knoten (Knoten (Node 1 leer leer) 2 Leer) 4 (Knoten leer 4 leer)) 5 (Knoten (Node Leer 6 Leer) 7 (Knoten Leer 8 Empty))

das ist der Baum zu sagen, soll wie folgt aussehen:

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

lieber als das:

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

Könnte jemand mir sagen, wie dies zu tun? Ich finde, ich kann den zweiten Baum tun, die nicht perfekt ausbalanciert ist, aber nicht wissen, wie die ersten zu tun.

Ich schätze jede Hilfe !! Vielen Dank im Voraus!

Veröffentlicht am 30/09/2013 um 09:56
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
7

Sortieren Sie die Eingabeliste. schafft nun einen Baum, dessen Wurzelknoten ist das mittlere Element der Liste, und die linken und rechte Teilbäume, die sind die Teilbäume, die durch dieses Verfahren auf die Unterlisten nach links und rechts von der Mitte der Anwendung ist.

In 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))
Beantwortet am 30/09/2013 um 10:06
quelle vom benutzer

stimmen
0

Wenn die Spitze des Baumes muss das mittlere Element sein:

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'

Wenn nicht:

mkBalanced [] = Empty
mkBalanced (x:xs) = Node x (mkBalanced half0) (mkBalanced half1)
    where (half0, half1) = splitAt (length xs `div` 2) xs
Beantwortet am 01/10/2013 um 23:56
quelle vom benutzer

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