用于确定1个二叉搜索树中的值集是否等于方案

时间:2015-11-02 00:26:00

标签: scheme binary-tree

我正在尝试编写一个函数来检查一个二叉搜索树中的所有值是否都出现在函数为(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)))

1 个答案:

答案 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)))))