gpt4 book ai didi

list - 带列表的二叉搜索树

转载 作者:行者123 更新时间:2023-12-04 05:55:31 25 4
gpt4 key购买 nike

我想创建一个函数 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

最佳答案

相信程序bst->list可以用更简单有效的方式编写,如下所示:

(define (bst->list t)
(let inorder ((tree t)
(acc empty))
(if (empty? tree)
acc
(inorder (BST-left tree)
(cons (BST-key tree)
(inorder (BST-right tree)
acc))))))

在上面的代码中,我没有使用 append建立所有键的列表,只有 cons操作。之后,构建一个过滤所需范围内键的过程应该是微不足道的:
(define (in-between-bst i j t)
(filter <???>
(bst->list t)))

编辑:

这是 bst->list程序,不使用 let并使用 cond而不是 if :
(define (bst->list t)
(inorder t empty))

(define (inorder tree acc)
(cond ((empty? tree)
acc)
(else
(inorder (BST-left tree)
(cons (BST-key tree)
(inorder (BST-right tree)
acc))))))

关于list - 带列表的二叉搜索树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com