我想创建一个功能inbetweenbst: int int BST -> ilist
,作为(inbetweenbst I J T),产生全部消耗BST牛逼是严格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
有没有一种方法来编码它,如果,因为我还没有看到过这些表达式? – Thatdude1 2012-03-04 07:35:11
@Beginnernato好了,我重写了'bst-> list'过程,现在它不使用名为let(我使用了一个辅助过程)。但是你怎么没有看到过“if”?它只是一个'cond',只有两种选择,实际上每种流行的编程语言都有这种或那种形式! – 2012-03-04 14:37:58
谢谢,我想你知道了..我知道如果,这是在球拍我只习惯使用cond和本地定义,而不是让 – Thatdude1 2012-03-04 16:13:28