我正在尝试编写一个函数来检查一个二叉搜索树中的所有值是否都出现在函数为(bst-set-equal)
的另一个值中,这样(bst-set-equal? '(1 (5 () (6 () ()))) '(5 (1 () ())(6 () ())))
返回true。但是,我写的函数返回false,我无法确定原因。我测试时bst-subset?
没有遇到任何问题,但这很可能就是问题,因为bst-set-equal
的设置似乎有意义。
(define (bst-element? item bst-tree)
(cond ((null? bst-tree)#f)
((equal? item (bst-value bst-tree))#t)
((bst-element? item (bst-left bst-tree)))
(else (bst-element? item (bst-right bst-tree)))))
(define (bst-subset? bst1 bst2)
(cond ((null? bst1)#t)
((bst-element? (bst-value bst1)bst2)
(and (bst-subset? (bst-left bst1)(bst-left bst2))
(bst-subset? (bst-right bst1)(bst-right bst2))))
(else #f)))
(define (bst-set-equal? bst1 bst2)
(cond ((and (bst-subset? bst1 bst2)
(bst-subset? bst2 bst1))#t)
(else #f)))
答案 0 :(得分:1)
当问题bst-subset?
返回true时,问题出在函数(bst-element? (bst-value bst1) bst2)
中:您检查bst1
的左子树是否包含在bst2
的左子树中,但它可以包含在整个树bst2
中(类似于严格子树)。此外,您不会检查bst2
的空白,这可能会导致错误。
您可以通过以下方式更改功能:
(define (bst-subset? bst1 bst2)
(cond ((null? bst1) #t)
((null? bst2) #f)
(else (and (bst-element? (bst-value bst1) bst2)
(bst-subset? (bst-left bst1) bst2)
(bst-subset? (bst-right bst1) bst2)))))
另请注意,您可以通过以下方式消除冗余bst-set-equal?
来简化cond
的定义:
(define (bst-set-equal? bst1 bst2)
(and (bst-subset? bst1 bst2)
(bst-subset? bst2 bst1)))
并且,同样地,您也可以简化bst-element?
的定义,例如以这种方式:
(define (bst-element? item bst-tree)
(if (null? bst-tree)
#f
(or (= item (bst-value bst-tree))
(bst-element? item (bst-left bst-tree))
(bst-element? item (bst-right bst-tree)))))