Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 方案中的二叉树_Scheme_Racket - Fatal编程技术网

Scheme 方案中的二叉树

Scheme 方案中的二叉树,scheme,racket,Scheme,Racket,我如何计算一棵树有多少个节点 ;;; A Binary is one of: ;;; - Number ;;; - (make-node BT BT) (define-struct node (left right)) (define tree1 (make-node (make-node 10 9) (make-node 3 (make-node 1 5)))) (define (how-many? nd) (cond [(number? nd)....] [(no

我如何计算一棵树有多少个节点

;;; A Binary is one of:
;;; - Number
;;; - (make-node BT BT)


(define-struct node (left right))

(define tree1 (make-node (make-node 10 9)
(make-node 3
(make-node 1 5))))

(define (how-many? nd)
  (cond
    [(number? nd)....]
    [(node? n)
     (..... (how-many? (node-left nd))
             (how-many? (node-right nd)))]))
所以对于tree1我应该

 (check-expect (how-many? tree1) 5)

我想我的模板是对的。如果是数字,则应返回
1
。但是如果它是一个
节点
,我应该在虚线中添加什么类型的函数

这与处理列表的方式有些类似。区别是什么?现在,您将转到每个节点的“左”和“右”,而不是只转到“其余”。除此之外,同样的想法也适用于:

(define (how-many? nd)
  (cond
    [(number? nd) <???>] ; if it's a leaf, then how many numbers does it have?
    [(node? nd)
     (<???> (how-many? (node-left nd)) ; how do we combine the results?
            (how-many? (node-right nd)))]))
(定义(多少?nd)
(续)
如果它是一片叶子,那么它有多少个数字?
[(节点?nd)
((多少?(节点左nd));我们如何组合结果?
(有多少?(节点右侧第二个))])

正如我在问题中所看到的,你的基本情况是正确的。递归的情况很简单!记住,在列表中添加元素时,我们是如何组合结果的?这是同样的事情,只是我们合并了左子树和右子树的结果。

这有点类似于处理列表的方式。区别是什么?现在,您将转到每个节点的“左”和“右”,而不是只转到“其余”。除此之外,同样的想法也适用于:

(define (how-many? nd)
  (cond
    [(number? nd) <???>] ; if it's a leaf, then how many numbers does it have?
    [(node? nd)
     (<???> (how-many? (node-left nd)) ; how do we combine the results?
            (how-many? (node-right nd)))]))
(定义(多少?nd)
(续)
如果它是一片叶子,那么它有多少个数字?
[(节点?nd)
((多少?(节点左nd));我们如何组合结果?
(有多少?(节点右侧第二个))])

正如我在问题中所看到的,你的基本情况是正确的。递归的情况很简单!记住,在列表中添加元素时,我们是如何组合结果的?这是同样的事情,只是我们将左子树和右子树的结果结合起来。

那么,就用加法符号?怎么会呢。如果要将所有节点添加到一起,是否会使用加法符号?哇@Josh这就是递归的魔力:每次调用
多少?
,你都会得到树的这一部分中的节点数——不管是左还是右。要获得整棵树的总和,只需将左侧的结果加上右侧的结果,现在就完全有意义了。谢谢。@Josh总是问自己这样一个问题:我如何组合结果?第一个元素和其余元素的结果(对于列表)。或当前节点、左子树和右子树(对于树)的结果。在这个特殊的树中更简单,因为只有树的叶子包含数据,所以只有加法符号?怎么会呢。如果要将所有节点添加到一起,是否会使用加法符号?哇@Josh这就是递归的魔力:每次调用
多少?
,你都会得到树的这一部分中的节点数——不管是左还是右。要获得整棵树的总和,只需将左侧的结果加上右侧的结果,现在就完全有意义了。谢谢。@Josh总是问自己这样一个问题:我如何组合结果?第一个元素和其余元素的结果(对于列表)。或当前节点、左子树和右子树(对于树)的结果。在这种情况下,树更简单,因为只有树的叶子包含数据