我正在创建一个函数来检查项目是否是树中叶子的成员。
这是我到目前为止所拥有的。但它不能正常工作。应该为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
答案 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)
你接近答案了。要解决它,你必须:
item
与树叶中的实际值进行比较(不包含树叶本身!)cdr
在这里没有任何意义,这是我们遍历的树,而不是列表。在这两种情况下,请使用适当的访问程序。我会尝试猜测他们的名字,让他们适应你自己的实现:
(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)))))))