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

时间:2014-07-14 07:11:36

标签: struct scheme binary-tree racket

对于我的HW,使用这些结构:

(define-struct Plus (tl tr))
(define-struct Neg (t))
(define-struct Times (tl tr))

我必须解决以下问题:

height:num-tree - > num,用于计算树的最长分支中的节点数。

unparse:num-tree - >用于构造与给定树匹配的Racket表达式的字符串。

以下各项的示例如下:

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

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

我对身高问题的疑问是如何检查哪一个是给定树的最长边?当我有一个带有两个参数的结构(比如说Times)时,如何检查哪一个具有更长的分支?之前的问题让我们解决了树的大小问题,但问题是,树的大小很容易解决,因为你只需要对所有条件执行+1,直到达到基本情况为止。高度不同,因为您不想计算树的左侧和右侧的节点,而只计算具有最大高度的节点。

对于unsarse,我们还必须做一个让我们评估数字树的问题。但是,我不知道如何解决这个问题,因为你无法真正使用我为了解决这个问题而做出的评估函数。

有任何解决这个问题的建议吗?

1 个答案:

答案 0 :(得分:1)

对于程序height,如果结构有2个字段,则只需使用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)))

对于unparse,只需要连接字符串,无需进行评估:

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