-3

ツリー データ型を指定すると、ツリーの深さが返される再帰関数を記述する必要があります。ツリーの深さを数えるための再帰関数を書く

let treeCons x = (\x -> foldl (flip insertTree) Empty x) x 
depth (treeCons []) -> 0 
depth (treeCons [5,4,6,3,7,1]) -> 4 
depth (treeCons [1,2,5,8,9,4,7]) -> 5 
depth (treeCons [5,4,6,3,7,1,2,5,8,9,4,7,8,5,3,4]) -> 6 

私は、次のデータ型を書いて、機能挿入します:しかし

data Tree a = Node a (Tree a) (Tree a) | Empty deriving (Show, Eq) 
insertTree :: (Ord a) => a -> Tree a -> Tree a 
insertTree a Empty = Node a Empty Empty 
insertTree a (Node b Empty Empty) = if (a <= b) then (Node b (Node a Empty Empty) Empty) else (Node b Empty (Node a Empty Empty)) 
insertTree a (Node b left right) = if (a <= b) then (Node b (insertTree a left) right) else (Node b left (insertTree a right)) 

を、私の空の木は、単一のルートノードのツリーが1

期待される出力を返す必要があります 0を返す必要がありますどのように深さの関数を書くのか分からない。私はhaskellで非常に新しく、誰かが私を助けてくれたら分かるだろう。

+0

空の木と葉の深さを指定しました。これはすでに関数定義の最初の2つのケースを示しています(ただし、葉の深さを指定することは技術的に冗長です)。しかし、子どもがいるノードの深さはどうですか?これを正式に書いたら、関数定義の最後のケースを明らかにする必要があります。 – sepp2k

+1

'insertTree'には2番目のケースは必要ありません。反復するサブツリーが空の場合、一般的なケース「Node b left right」はベースケース「Empty」に減少します。 – chepner

答えて

4

空の木は深さ0を持っており、ノードが深1プラスその子ノードの最大の深さを持っている:

あなたが行くここ
depth :: Tree a -> Int 
depth Empty = 0 
depth (Node _ l r) = 1 + max (depth l) (depth r) 
0

、リストを再帰、非常に簡単で、ツリーを約あります同じですが、データ型だけが異なります。問題の木の枝に当たるたびに1を加えます:

tDepth :: Tree a -> Int 
tDepth Empty = 0 
tDepth (Node _ left right) = 1 + max (tLength left) (tLength right) 
+3

これは、ツリーの深さではなく、ノードの数です。 –

+0

あなたはすでに答えを出して以来、無意味ですが、あなたの右、私の悪いところは今修正されています – Bargros

関連する問題