Racket:给定卖家名称,以二叉树的形式打印出商品的销售结果

Racket: given the seller name, print the result of the products sold in a binary tree

代码的目标是当我输入卖家名称时,输出必须是所售产品的数量

(define-struct node (seller_info left_tree right_tree))

(define-struct seller (name quantity_sold))

(define treeSellers (make-node (make-seller "laura" 8)
                                   (make-node (make-seller "pedro" 5)empty empty)
                                   (make-node (make-seller "laura" 10)empty empty)
  )
 )
  
(define (addTree sellerName tree)
(cond
  [(empty? tree) empty]
  [(string=? sellerName (seller-name (node-seller_info tree)))
   (+ (seller-quantity_sold (node-seller_info tree)))]
  [else (addTree sellerName (node-left_tree tree))
        (addTree sellerName (node-right_tree tree))]
  )
  )

输出必须是

(addTree "laura" treeSellers) 18

而是

(addTree "laura" treeSellers) 8

有什么建议可以使输出符合要求吗?

您的代码存在三个主要问题:

  • 基本情况是错误的,你不能return empty,答案应该是一个数字,而不是一个列表。您必须在此处 return 归零。
  • 一旦找到匹配项,就停止了递归 - 但可能还有更多匹配项,您必须继续查找。
  • else 的情况下,您没有将两个结果加在一起,实际上,您丢弃了左子树的值,仅 return 右子树的值。

这应该可以解决所有问题:

(define (addTree sellerName tree)
  (cond
    [(empty? tree) 0]
    [(string=? sellerName (seller-name (node-seller_info tree)))
     (+ (seller-quantity_sold (node-seller_info tree))
        (addTree sellerName (node-left_tree tree))
        (addTree sellerName (node-right_tree tree)))]
    [else
     (+ (addTree sellerName (node-left_tree tree))
        (addTree sellerName (node-right_tree tree)))]))

现在它按预期工作了:

(addTree "laura" treeSellers)
=> 18
(addTree "pedro" treeSellers)
=> 5
(addTree "ivan" treeSellers)
=> 0