球拍树运输

时间:2018-09-07 18:05:29

标签: recursion tree racket traversal

我的球拍有以下问题。

我正在尝试对通用树进行树的预排序,后遍历。

结构定义为:

(define-struct eempty [])
(define-struct branch [left value right])

我不能使用unless/when运算符,只能使用ifcond。 我真的无法提出解决方案。我已经看过Wikipedia伪代码,但是由于球拍编程范例而没有帮助。

(define (inorder tree x)
  (cond [(and (branch? tree) (branch? (branch-left tree))) (inorder (branch-left tree) x)]
        [(and (branch? tree) (branch? (branch-right tree))) (inorder (branch-right tree) x)]

这是我到目前为止所做的,但是在匹配empty结构时会遇到问题。

更新:

我想做的是按顺序或/和后顺序显示/打印节点值。

我知道我还必须(另外)实施2个条件:

(and (branch? tree) (empty? (branch-left tree))) do-something x)
(and (branch? tree) (empty? (branch-right tree))) do-something x)

在做某事时我必须做什么?我想我错过了这一点。

有帮助吗?

2 个答案:

答案 0 :(得分:1)

似乎您缺少“空”结构的“条件”分支。您可以参考How To Design Programs教科书以获取有关此方面的帮助,特别是与混合自参考数据相关的“模板”步骤。

答案 1 :(得分:0)

我们从拥有的东西开始

#lang racket
(define-struct empty [])                     ; no fields
(define-struct branch [left value right])    ; three fields

我们可以尝试制作一些树木:

(define t1 (empty))
(define t2 (branch t1 7 t1))

现在我们可以尝试一下:

> t2
#<branch>
> (branch-left t2)
#<empty>
> (branch-left t1)
branch-left: contract violation
  expected: branch?
  given: #<empty>
> (branch? t2)
#t
> (branch? t1)
#f
> (empty? t2)
#f
> (empty? t1)
#t
>

所以是我们的全部曲目。 Racket的 struct 宏定义了供我们使用的各种函数-构造函数,访问器,谓词,...。

如何打印值?说,

(define (display-value v)
  (display #\ )
  (display v))

现在我们可以

> (display-value (branch-value t2))
 7

empty没有value字段,只有branch有:

(define (display-tree-inorder t)
    (cond
        ((empty? t)
           (display-empty) )                       ; define it later
        ((branch? t)
           (display-branch-inorder                 ; define it later
                           (branch-left t)
                           (branch-value t)
                           (branch-right t)))))

在定义此类型时,我们遵循了类型:我们的树是emptybranch 是我们 用这两个结构定义定义它们的方式。

剩下的就是完成display-emptydisplay-branch-inorder缺少的定义。

但是在我们这样做之前,我们还可以拥有

(define (display-tree-preorder t)
    (cond
        ((empty? t)
           (display-empty) )
        ((branch? t)
           (display-branch-preorder
                           (branch-left t)
                           (branch-value t)
                           (branch-right t)))))

(define (display-tree-postorder t)
    (cond
        ((empty? t)
           (display-empty) )
        ((branch? t)
           (display-branch-postorder
                           (branch-left t)
                           (branch-value t)
                           (branch-right t)))))

display-empty在做什么?它什么都不做:

(define (display-empty)
    #f)

display-branch-inorder又如何呢?

(define (display-branch-inorder lt val rt)

我确信,根据维基百科,它首先显示其 子树

    (display-tree-inorder .... ) 

然后显示其值

    (display-value .... )

并通过显示正确的子树来完成:

    .... )

与其他两个变体相同。

完成所有这些操作后,您将感受到遵循关注点分离原则进行抽象和概括的渴望。好。我们的display-tree-inorder将几件事融合在一起:它根据顺序的概念遍历一棵树,并且对每个节点的值进行处理。所有这些都可以抽象化并作为通用过程的参数,例如traverse-tree

所以您看,这很简单:按照类型输入!,一切都会符合您的要求。