Struct 如何解列和测量二叉树的高度

Struct 如何解列和测量二叉树的高度,struct,scheme,binary-tree,racket,Struct,Scheme,Binary Tree,Racket,因此,对于我的硬件,使用以下结构: (define-struct Plus (tl tr)) (define-struct Neg (t)) (define-struct Times (tl tr)) 我必须解决以下问题: 高度:num tree->num,计算树的最长分支中的节点数 及 unpasse:num tree->string来构造与给定树匹配的球拍表达式 以下是每种方法的示例: (height (make-Plus (make-Neg (make-Times 3 4)) (make

因此,对于我的硬件,使用以下结构:

(define-struct Plus (tl tr))
(define-struct Neg (t))
(define-struct Times (tl tr))
我必须解决以下问题:

高度:num tree->num,计算树的最长分支中的节点数

unpasse:num tree->string来构造与给定树匹配的球拍表达式

以下是每种方法的示例:

(height (make-Plus (make-Neg (make-Times 3 4)) (make-Neg 6)))
 => 4

关于高度问题,我的问题是如何检查给定树的哪一侧最长?当我有一个有两个参数的结构(比如说Times)时,我如何检查哪一个具有更长的分支?前面的一个问题让我们求解树的大小,但问题是,求解树的大小确实很容易,因为在达到基本情况之前,所有条件都是+1。高度不同,因为您不想同时计算树的左侧和右侧的节点,而只计算高度最大的节点

对于unparse,我们还必须做一个让我们评估数字树的问题。但是,我不知道如何解决这个问题,因为您不能真正使用我为解决这个问题而创建的求值函数


有没有解决此问题的建议?

对于过程
高度
,如果结构有两个字段,只需使用
max

(define (height tree)
  (cond
    ((Plus? tree)  (add1 (max (height (Plus-tl tree))  (height (Plus-tr tree)))))
    ((Times? tree) (add1 (max (height (Times-tl tree)) (height (Times-tr tree)))))
    ((Neg? tree)   (add1 (height (Neg-t tree))))
    (else          1)))
对于
unpasse
,只需连接字符串,无需计算:

(define (unparse tree)
  (cond
    ((Plus? tree)   (format "(+ ~a ~a)" (unparse (Plus-tl tree))  (unparse (Plus-tr tree))))
    ((Times? tree)  (format "(* ~a ~a)" (unparse (Times-tl tree)) (unparse (Times-tr tree))))
    ((Neg? tree)    (format "(- ~a)"    (unparse (Neg-t tree))))
    (else           (format "~a" tree))))
测试:

(define x (make-Plus (make-Neg (make-Times 3 4)) (make-Neg 6)))
(height x)
=> 4
(unparse x)
=> "(+ (- (* 3 4)) (- 6))"
(define x (make-Plus (make-Neg (make-Times 3 4)) (make-Neg 6)))
(height x)
=> 4
(unparse x)
=> "(+ (- (* 3 4)) (- 6))"