2013-09-28 34 views
0

因此,我正在研究一個函數,該函數檢測兩個二叉樹是否具有相同的數字。Haskell:比較兩個二叉樹是否具有相同的元素

所以我想到的是以下工作正常,但問題是,我使用總共5個功能。是否有另一種方法來檢測兩個BT是否只有一個功能具有相同的元素?這是我迄今爲止的解決方案,似乎工作得很好。

flatten :: BinTree a -> [a] 
flatten Empty  = [] 
flatten (Node l x r) = flatten l ++ [x] ++ flatten r 

splt :: Int -> [a] -> ([a], [a]) 
splt 0 xs = ([], xs) 
splt _ [] = ([],[]) 
splt n (x:xs) = (\ys-> (x:fst ys, snd ys)) (splt (n-1) xs) 

merge :: Ord a => [a] -> [a] -> [a] 
merge xs [] = xs 
merge [] ys = ys  
merge (x:xs) (y:ys) = if (x > y) then y:merge (x:xs) ys else x:merge xs(y:ys) 

msort :: Ord a => [a] -> [a] 
msort [] =[] 
msort (x:[]) = (x:[]) 
msort xs = (\y -> merge (msort (fst y)) (msort (snd y))) (splt (length xs `div` 2) xs) 

areTreesEqual :: (Ord a) => BinTree a -> BinTree a-> Bool 
areTreesEqual Empty Empty = True 
areTreesEqual Empty a = False 
areTreesEqual a Empty = False 
areTreesEqual a b = msort (flatten (a)) == msort (flatten (b)) 
+0

爲什麼你需要定義自己的合併排序函數,而不是使用'Data.List.sort'('By')?這將節省3個功能。 – kennytm

回答

1

import Data.MultiSet as Set 

equal a b = accum a == accum b 
    where accum Empty = Set.empty 
     accum (Node l x r) = Set.insert x (accum l `Set.union` accum r) 

如何設定是可愛的無序比較多集將確保

1 /= 1 
1 1 

例如,重複的數字是正確計算。如果這不是一個大問題,那麼換用代替Set。我認爲3線對於這類事情是相當不錯的。

相關問題