엄밀히 말하면 i와 j 사이에있는 소비 된 BST t의 모든 키 목록을 생성하는 함수 inbetweenbst: int int BST -> ilist
을 (inbetweenbst ij t)로 사용하려고합니다. 이 범위의 키가있는 요소가 t이 없으면 함수는 빈 목록을 생성해야합니다. i ≤ j이라고 가정하십시오리스트가있는 바이너리 검색 트리
또한 실행 시간이 O (n)이어야합니다. 여기서 n은 t의 요소 수이고 변이를 사용하지 않아야합니다.
나는 기본적으로 나무는 바로 노드하도록 변경 다음 코드로 올라와있다:하지만 난 내 코드 실행의 O에서 (N^2) 생각
(define (bst->list t)
(cond
[(empty? t) empty]
[else
(append (bst->list (BST-left t)) (cons (BST-key t) empty) (bst->list (BST-right t)))]))
(define (list->bst lst)
(cond
[(empty? lst) empty]
[else (make-BST (first lst) empty (list->bst (rest lst)))]))
(define (inbetweenbst i j t)
(define bst (list->bst (bst->list t)))
(cond
[(empty? bst) empty]
[(and (> (BST-key bst) i) (< (BST-key bst) j))
(cons (BST-key bst) (inbetweenbst i j (BST-right bst)))]
[else (inbetweenbst i j (BST-right bst))]))
을 .... 어떤 제안 O (n)을 실행하게 ... 나는 O (n) 함수 이후로 append
을 사용할 수 없다. 나는 단지 cons
으로 제한되어있다 ... 어떤 아이디어가 도움이 되었습니까? = D
거기에 let과 if없이 코드를 작성하는 방법이 있습니다. 이전에이 표현을 보지 못했기 때문에? – Thatdude1
@Beginnernato OK,'bst-> list' 프로 시저를 다시 작성했습니다. 이제는 이름이 지정된 let을 사용하지 않습니다 (대신 도우미 프로 시저를 사용했습니다). 그런데 어떻게 전에 '만약'을 보지 못했습니까? 그것은 단지 두 가지 대안을 가진'cond' 일뿐입니다. 그리고 실제로 모든 대중적인 프로그래밍 언어는 그것을 하나의 형태로 가지고 있습니다! –
고맙습니다. 당신이 알아 낸 것 같아요 .. 만약 내가 알고 있다면, 라켓에서 나는 cond와 local 정의 대신에 let을 사용하는 데 익숙해 졌다고 생각합니다. – Thatdude1