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

Count nodes in a binary tree without leaf?/node? in scheme?

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

事实上,您 不需要 leaf?node? 过程,如果我们要计算节点数,只需添加 1 他们每一个:

(define (tree-node-count t)
  (cond ((null? t) 0)
        (else (+ 1
                 (tree-node-count (left  t))
                 (tree-node-count (right t))))))

Scheme 中没有执行二叉树的标准方法,因此 leftrightleaf?node? 等过程在不同的平台上有不同的实现数据建模的方法。例如。这是一个使用向量的方法:

(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))))))

如您所见,这是对原始过程主体的简单替换。我当然会反对它,因为这只会让代码和程序员的意图变得不那么清晰。删除抽象不会为您赢得积分。