我正在尝试编写一个将数字插入到现有树中的函数。到目前为止我已经
了(define (make-tree v left right)
(list v left right))
(define (value t)
(car t))
(define(left t)
(cadr t))
(define(right t)
(caddr t))
(define new-tree (make-tree 10
(make-tree 6
(make-tree 3 null null)
(make-tree 7 null null))
(make-tree 11
(make-tree 3 null null)
(make-tree 12 null null))))
(define(my-tree initial-tree)
(let ((tree initial-tree))
(define (element? f)
(define(sub-element? f t)
(begin
(cond
((null? t) #f)
((eq? f (value t)) #t)
((> f (value t)) (sub-element? f (right t)))
((< f (value t)) (sub-element? f (left t))))))
(sub-element? f tree))
(define (insert f)
(define (sub-insert f t)
(begin
(set! tree
(cond
((null? t) (make-tree f null null))
((eq? f (value t)) t)
((< f (value t)) (make-tree (value t) (sub-insert f (left t)) (right t)))
((> f (value t)) (make-tree (value t) (left t) (sub-insert f (right t))))))))
(sub-insert f tree)
tree)
(lambda (method)
(cond
((eq? method 'insert) insert)
((eq? method 'element?) element?)))))
结果输出为(10 #<void> (11 (3 () ()) (12 () ())))
当我做((test-tree 'insert)5)
时。我想知道为什么会这样。
答案 0 :(得分:1)
T(n) = 2T(n/2) + O(1)
的结果是T(n) = O(n)
的返回值,而球拍的sub-insert
则不返回任何内容,或set!
。
在递归过程中不要修改set!
相反,首先构建结果,然后更新#<void>
:
tree
其余代码可以保持不变。
我可以建议您使用更小更简单的测试用例开始测试 您可能会发现单节点树存在同样的问题,这更容易推理和调试 (请注意,您的测试树不是一个有效的搜索树,因此它不是一个非常好的测试用例。)