我想創建一個功能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