이것은 숙제 문제입니다.SML에서 이진 트리의 가장 깊은 요소 찾기
내 질문에 간단합니다 : 형식의 btree_deepest 'a btree ->'트리의 가장 깊은 요소의 목록을 반환하는 목록을 작성하십시오. 트리가 비어 있으면 가장 깊은 곳에서 []를 반환해야합니다. 동일한 최대 깊이에 입력 트리의 요소가 여러 개있는 경우, 가장 깊은 요소는 선주문 순회에 따라 정렬 된 가장 깊은 요소가 포함 된 목록을 반환해야합니다. 함수는 제공된 btree_reduce 함수를 사용해야하며 재귀 적이어야합니다.
여기 내 코드입니다 :
(* Binary tree datatype. *)
datatype 'a btree = Leaf | Node of 'a btree * 'a * 'a btree
(* A reduction function. *)
(* btree_reduce : ('b * 'a * 'b -> 'b) -> 'b -> 'a tree -> 'b) *)
fun btree_reduce f b bt =
case bt of
Leaf => b
| Node (l, x, r) => f (btree_reduce f b l, x, btree_reduce f b r)
(* btree_size : 'a btree -> int *)
fun btree_size bt =
btree_reduce (fn(x,a,y) => x+a+y) 1 bt
(* btree_height : 'a btree -> int *)
fun btree_height bt =
btree_reduce (fn(l,n,r) => Int.max(l, r)+1) 0 bt
나는 깊은 요소의 목록을 구축 할 수 btree_reduce에 전달하는 함수를 만들 필요가 있음을 알고 나는 비틀 거리는 오전 곳입니다.
재귀를 허용했다면 왼쪽 노드와 오른쪽 노드의 높이를 비교 한 다음 어느 것이 더 높은 지점에 재연 (또는 둘 다 동일한 높이에 있으면 재귀) 한 다음 현재 요소를 반환합니다. 높이가 0이고 이러한 요소를 목록에 던집니다. 난 그냥 시작하는 올바른 방향으로 밀어 필요가 있다고 생각
...
감사합니다!
업데이트 : 여기
컴파일하지 않는 솔루션에서 시도이다 :fun btree_deepest bt =
let
val (returnMe, height) = btree_reduce (fn((left_ele, left_dep),n,(right_ele, right_dep)) =>
if left_dep = right_dep
then
if left_dep = 0
then ([n], 1)
else ([left_ele::right_ele], left_dep + 1)
else
if left_dep > right_dep
then (left_ele, left_dep+1)
else (right_ele, right_dep+1)
)
([], 0) bt
in
returnMe
end
컴파일러 오류는 '0, bt'의 맨 끝에있는 쉼표를 제거하십시오. – waldrumpus