Я хочу создать функцию inbetweenbst: int int BST -> ilist
, используемую как (inbetweenbst i j t), которая создает список всех ключей в потребляемом BST t, которые находятся строго между i и j. Если в t нет элементов с ключом в этом диапазоне, то функция должна создать пустой список. Предположим, что я ≤ 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