(Scheme)查找项目是否是树中叶子的成员?

时间:2013-03-26 01:20:29

标签: tree scheme

我正在创建一个函数来检查项目是否是树中叶子的成员。

这是我到目前为止所拥有的。但它不能正常工作。应该为true的一些输入返回false。请帮忙吗?

(define (leaf-member? item tr)
 (cond
  [(empty-tree? tr) #f]
  [(leaf? tr)
      (if (equal? item tr) #t
          #f)]
  [else (leaf-member? item (cdr tr))]))

这应该归还:

~(leaf-member? 'a (leaf 'a))
#t

3 个答案:

答案 0 :(得分:0)

看来你不是在使用树木而是列表。我是这么说的,因为如果你在树上,那么你不会搜索列表的其余部分('cdr'),而是搜索左右分支。

如果您发布如何创建非叶树以便更好地为您提供建议,那将会有所帮助,但无论如何,您的最终陈述不应该是:

[else (leaf-member? item (cdr tr))]

但是这样的事情:

[else (or (leaf-member? item (left-branch tr))
          (leaf-member? item (right-branch tr)))]

答案 1 :(得分:0)

你接近答案了。要解决它,你必须:

  1. 将提供的item与树叶中的实际进行比较(不包含树叶本身!)
  2. 正确推进两个子树的递归。请注意,使用cdr在这里没有任何意义,这是我们遍历的,而不是列表。
  3. 在这两种情况下,请使用适当的访问程序。我会尝试猜测他们的名字,让他们适应你自己的实现:

    (define (leaf-member? item tr)
      (cond
        [(empty-tree? tr)
         #f]
        [(leaf? tr)
         (if (equal? item (tree-value tr))
             #t
             #f)]
        [else
         (or (leaf-member? item (tree-left tr))
             (leaf-member? item (tree-right tr)))]))
    

答案 2 :(得分:0)

在树中查找项目的代码取决于树的定义。特别是,如果您定义一个由子树组成的树,那么这表示您将如何在树上递归。因此,您需要从'tree'和'leaf'的定义开始。

这是一个完整的解决方案,没有假设二叉树。

(define (make-tree item children)
  `(TREE ,item ,children))
(define (tree? thing)
  (and (list? thing)
       (= 3 (length thing))
       (eq? 'TREE (car thing))))
(define tree-item cadr)
(define tree-children caddr)

(define (make-leaf item)
  (make-tree item '()))
(define (leaf? tree) 
  (and (tree? tree) (null? (tree-children tree)))

(define (leaf-member? tester item tree)
  (and (tree? tree)
       (or (and (leaf? tree) (tester item (tree-item tree)))
           (let looking ((subtrees (tree-children tree)))
              (and (not (null? subtree))
                   (or (leaf-member? equal item (car subtrees))
                       (looking (cdr subtrees)))))))