2015-05-05 54 views
1

有沒有辦法將其轉換,以便根據身高檢查平衡? (假設這就是問題所在。)Haskll,高度平衡檢查

size :: Tree a -> Int 
size (Leaf n) = 1 
size (Node x z) = size x + size z + 1 

isBalanced :: Tree a -> Bool 
isBalanced (Leaf _) = True 
isBalanced (Node l r) = 
    let diff = abs (size l - size r) in 
    diff <= 1 && isBalanced l && isBalanced r 

例如:

isBalanced (Node (Node (Leaf 1)(Leaf 3)) (Leaf 2))) = True (Currently returns False) 
isBalanced (Node (Node (Leaf 1)(Node (Leaf 1)(Leaf 3))) (Leaf 2))) = False 

回答

3

似乎size計數節點的總數。如果要計算(最大值)的高度,而不是,你想是這樣的:

height :: Tree x -> Int 
height (Leaf _) = 1 
height (Node x y) = 1 + (height x `max` height y) 

如果你只是用height取代size,該isBalanced代碼應該像以前一樣工作。

這是否修復您的問題還有待觀察,當然,...

+0

這似乎已經解決了這個問題,謝謝! – user3633383