Я хочу создать функцию inbetweenbst: int int BST -> ilist
, используемую как (inbetweenbst i j t), которая создает список всех ключей в потребляемом BST t, которые находятся строго между i и j. Если нет элементов в t с ключом в этом диапазоне, то функция должна создать пустой список. Предположим, что i ≤ jДвоичное дерево поиска со списками
Также я должен убедиться, что время работы должно быть O (n), где n - количество элементов в t и не использовать мутацию.
я придумал следующий код, который в основном изменяет дерево, чтобы иметь только правильные узлы:
(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^2) .... любые предложения чтобы он запускался O (n) ... Я довольно не могу использовать append
с его функцией O (n), я ограничен только cons
... Я потерял идеи, любое предложение поможет? = D
есть способ кодировать его без let и if, так как я еще не видел эти выражения раньше? – Thatdude1
@Beginnernato OK, я переписал процедуру 'bst-> list', теперь он не использует named let (вместо этого я использовал вспомогательную процедуру). Но почему вы еще не видели «если»? это просто «cond» с двумя альтернативами, и практически каждый популярный язык программирования имеет это в той или иной форме! –
Спасибо, я думаю, вы поняли это. Я знаю о том, если это так, то в racket я использовал для использования cond и локальных определений вместо let – Thatdude1