2017-11-16 27 views
1

私は木の高さを返す「高さ」関数を持っています。しかし、私はそれを使用しようとすると、私はこの例外を取得します。どうすれば修正できますか?また、指定されたツリーが均衡しているかどうかをチェックする関数 "isBalancedTree"もあります。ハスケルで二分木の高さを見つける

data Tree = Node Tree Int Tree | Leaf Int deriving Show 

height :: Tree -> Integer 
height (Node left x right) = 1 + max (height left) (height right) 

isBalancedTree :: Tree -> Bool 
isBalancedTree (Node left x right) = 
    let diff = abs (height left - height right) in 
    diff <= 1 && isBalancedTree left && isBalancedTree right 

*メイン>高さ((ノード(リーフ3)4(リーフ2))5(ノード(リーフ4)7(リーフ6)))

***例外:非heightの機能の高さが網羅パターン

+2

何 'isBalanced'場合、または' 'height' Leaf'を取得しますか? –

+2

'-Wall'で警告を有効にしてください!コンパイラはパターンマッチングで欠けているケースを指摘します。強く推奨する。 – chi

答えて

1

あなたの再帰的な実装はいいですが、あなたは、単一の葉の基本ケースを忘れてしまった:

height (Leaf _) = 1 

これは例外が文句を言っていることを欠落している模様です。同じことがあなたの第二の機能isBalancedに適用されます - あなたはLeafのためのケースを必要とし、あまりにも:

isBalanced (Leaf _) = True -- assuming a single-leaf tree is trivially balanced 
+0

ありがとうございます!私は2番目の関数についても同じ例外があります。それの問題は何ですか? – u23d7

+1

@ u23d7 2番目の関数の問題はまったく同じです。私は答えを更新しました。 – lisyarus

関連する問題