计算没有叶子/节点的二叉树中的节点?在计划?

时间:2015-10-28 00:32:22

标签: tree scheme

我正在尝试创建一个返回给定二叉树中节点数的函数,但是我没有访问该节点的权限?和叶子? 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)))))

2 个答案:

答案 0 :(得分:1)

事实上,如果我们正在计算节点数量,那么您不需要 leaf?node?程序,只需添加{{每个人都有1}}:

1

答案 1 :(得分:0)

在Scheme中没有标准的二进制树方法,因此leftrightleaf?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))))))

正如您所看到的,它是对原始程序的主体的简单替换。我当然会反对它,因为这只会使代码和程序员的意图不那么明确。删除抽象不会赢得你的积分。