우선 검색 기능이 제대로 작동하지 않아 조금만 청소했습니다. 형식 선언 오류에서 언 바운드 형식 변수를 피하려면 bst
형식을 'a bst
으로 정의해야합니다. 나는 또한 paranthesis 오류를 수정했습니다. 여기 search
기능의 나의 버전은 다음과 같습니다
datatype 'a bst = Leaf | Node of {data: 'a, left: 'a bst, right: 'a bst}
(*search(tree, compare, key) = t
where t = the tree which has `key` as its root
*)
fun search(tree : 'a bst, compare : ('a * 'a -> order), key : 'a)
: 'a bst option =
let
fun s(tree: 'a bst) : 'a bst option =
case tree of
Leaf => NONE
| Node({data=x, left=l, right=r}) =>
case compare(key,x) of
LESS => s(l)
| GREATER => s(r)
| EQUAL => SOME tree
in
s(tree)
end
(*Example:
search(Node({data=5,
left=Node({data=3,
left=Node({data=2,left=Leaf,right=Leaf}),
right=Node({data=4,left=Leaf,right=Leaf})}),
right=Leaf}),
Int.compare,
3);
*)
당신이 검색의 부모 및 조부모 노드를 반환하는 함수를 원하기 때문에, 당신은 다음의 튜플 반환하는 함수가 필요 :의 (검색 노드, 부모를 검색 노드, 검색 노드의 조부모). 그러나 부모님이나 조부모가 항상있는 것은 아닙니다. 예를 들어 찾고있는 키가 이미 기본 트리의 루트에있는 경우 부모 나 조부모가 없습니다. 따라서 option
유형을 사용해야합니다. 이렇게하면 해당 검색에 대한 상위 노드가없는 경우 NONE
을 부모 노드로 반환하는 데 도움이됩니다. 이제 (메인 트리, NONE
, NONE
)를 사용하여 검색을 시작한 다음 트리를 따라 이동하면서 부모 노드를 오른쪽으로 이동하면됩니다. 키를 찾지 못하면 NONE
의 세 쌍을 반환하십시오.
(*searchParent(tree, compare, key) =
(t, the parent of t, the grandparent of t)
where t = the tree which has `key` as its root
*)
fun searchParent(tree : 'a bst, compare : ('a * 'a -> order), key : 'a)
: ('a bst option * 'a bst option * 'a bst option) =
let
fun s(tree: 'a bst, par: 'a bst option, gpar: 'a bst option)
: ('a bst option * 'a bst option * 'a bst option) =
case tree of
Leaf => (NONE, NONE, NONE)
| Node({data=x, left=l, right=r}) =>
case compare(key,x) of
LESS => s(l, SOME tree, par)
| GREATER => s(r, SOME tree, par)
| EQUAL => (SOME tree, par, gpar)
in
s(tree, NONE, NONE)
end
(*Example:
searchParent(Node({data=5,
left=Node({data=3,
left=Node({data=2,left=Leaf,right=Leaf}),
right=Node({data=4,left=Leaf,right=Leaf})}),
right=Leaf}),
Int.compare,
4);
*)
내가 도울 수있는 희망 : 여기에 대한 코드입니다. 이 문제 또는 코드에 대해 다른 질문이 있으면 물어보십시오.
무엇을 이미 시도 했습니까? – Xan
내가 시도한 내용으로 내 게시물을 편집했습니다. – luthien