厳密にiとjの間にある、消費されたBST tのすべてのキーのリストを生成する関数inbetweenbst: int int BST -> ilist
を(betweenbetweenbst ij t)として作成します。この範囲のキーを持つtに要素がない場合、関数は空のリストを生成するはずです。私は以下のように仮定します。バイナリ検索ツリーのリスト
また、実行時間が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)を実行するには...私はかなりO(n)の機能以来append
を使用することはできません、私はcons
に制限されています...私はアイデアを失った、任意の提案は助けになる? = D
私はこれらの表現を前に見たことがないので、letとifなしでコードを書く方法はありますか? – Thatdude1
@Beginnernato OK、私は 'bst-> list'手続きを書きましたが、名前付きletを使わないようになりました(代わりにヘルパー手続きを使用しました)。しかし、どうやって前に「もし」見たことがないのですか?それはちょうど2つの選択肢を持つただの「条件」であり、事実上すべての一般的なプログラミング言語は、それをある形または別の形で持っています。 –
ありがとう、私はあなたがそれを理解したと思います..もし私が知っているのであれば、ラケットでは私はcondとlocalの定義をletの代わりに使うことに慣れていた – Thatdude1