-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 

과 기능을 삽입 : 빈 나무는 하나의 루트 노드 트리 1.

예상 출력 반환해야 0을 반환해야합니다, 그러나

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)) 

를 I 깊이 함수를 쓰는 방법을 모르겠다. 나는 haskell에서 아주 새롭고, 누군가가 나를 돕는다면 고맙겠다.

+0

빈 나무와 잎의 깊이를 명시했습니다. 이미 함수 정의의 처음 두 사례를 제공합니다 (잎의 깊이를 지정하는 것은 기술적으로 중복 됨). 그러나 어린이가있는 노드의 깊이는 무엇입니까? 공식적으로 그 내용을 적어두면, 함수 정의의 마지막 경우가 무엇인지 분명해야한다. – sepp2k

+1

'insertTree'에는 두 번째 케이스가 필요하지 않습니다. '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

옳은, 나쁘다, 당신이 벌써 대답을 줬던 이래로 무딘 isn''t는 지금 고치게된다. – Bargros

관련 문제