我正在尝试创建一个返回给定二叉树中节点数的函数,但是我没有访问该节点的权限?和叶子? R5RS语言中的函数。另外,我不太了解这种函数的终止条件,因为我尝试的大多数变体都会因内存不足而导致错误。感谢您提前提供任何帮助。
(define (make-tree value left right)
(list value left right))
(define (value tree)
(car tree))
(define (left tree)
(cadr tree))
(define (right tree)
(caddr tree))
(define (tree-node-count t)
(cond ((null? t)0)
((...?)
(else (+
(tree-node-count left)
(tree-node-count right)))))
答案 0 :(得分:1)
事实上,如果我们正在计算节点数量,那么您不需要 leaf?
或node?
程序,只需添加{{每个人都有1}}:
1
答案 1 :(得分:0)
在Scheme中没有标准的二进制树方法,因此left
和right
,leaf?
和node?
等程序在不同的方式上有不同的实现方式。建模数据。例如。这是一个使用vector:
(define TYPE-TREE (vector 'TREE)) ; private
(define (make-tree value left right)
(vector TYPE-TREE value left right))
(define (tree? tree)
(and (vector? tree)
(eq? (vector-ref tree 0) TYPE-TREE)))
(define (tree-value tree)
(vector-ref tree 1))
(define (tree-left tree)
(vector-ref tree 2))
(define (tree-right tree)
(vector-ref tree 3))
(define (tree-node-count tree)
(let aux ((tree tree) (count 0))
(if (not (tree? tree))
count
(aux (tree-right tree)
(aux (tree-left tree) (+ 1 count))))))
(define test (make-tree 5 (make-tree 2 '() '()) (make-tree 10 '() '())))
(tree-node-count test) ; ==> 3
当然你可以将它包装在一个库中并保持TYPE-TREE隐藏。要回答您的问题,您需要将程序替换为其实现。在上述模型的情况下,tree-node-count
将如下所示:
(define (tree-node-count tree)
(let aux ((tree tree) (count 0))
(if (not (and (vector? tree)
(eq? (vector-ref tree 0) TYPE-TREE)))
count
(aux (vector-ref tree 3)
(aux (vector-ref tree 2) (+ 1 count))))))
正如您所看到的,它是对原始程序的主体的简单替换。我当然会反对它,因为这只会使代码和程序员的意图不那么明确。删除抽象不会赢得你的积分。