首页 文章

BST打印没有变异?

提问于
浏览
0

所以我基本上想要printbst的..这里有一点细节

提供一个函数(printbst t),它按照以下格式打印由bst.rkt提供的BST构造的BST:

  • BST中的每个节点都应该打印在一个单独的行上;

  • 左子树应在根之后打印;

  • 正确的子树应该在根之前打印;

  • 键值应缩进2d空格,其中d是其深度或距离根的距离 . 也就是说,根不应缩进,其子树中的键应为2个空格,其子树中的键为4个空格,依此类推 .

例如,包含{1,2,3,4,5,6}的完整树将打印如下:

6
    5
4
    3
  2
    1

请注意,如果顺时针旋转输出并将每个节点连接到其子树,则会得到树的传统图形表示 . 不要使用变异 .

这是我到目前为止:

#lang racket
;;Note: struct-out exports all functions associated with the structure
(provide (struct-out BST))


(define-struct BST (key left right) #:transparent)

(define (depth key bst)
  (cond
    [(or (empty? bst) (= key (BST-key bst))) 0]
    [else (+ 1 (depth key (BST-right bst)) (depth key (BST-left bst)))]))

(define (indent int)
  (cond
    [(= int 0) ""]
    [else "  " (indent (sub1 int))]))

(define (printbst t)
  (cond
    [(empty? t) (newline)]
    [(and (empty? (BST-right t)) (empty? (BST-left t))) 
     (printf "~a~a" (indent (depth (BST-key t) t)) (BST-key t))]))

我的printbst只用一个节点打印一棵树....我有一个想法,但它涉及变异,我不能使用:( .....任何建议?我应该一起改变我对问题的处理方法吗?

1 回答

  • 1

    简短的回答:是的,你想要或多或少完全重组这个 .

    好的一面,我喜欢你的缩进功能:)

    编写此问题的最简单方法是在子树上进行递归调用 . 我希望当我告诉你为了打印一个子树时,我不会放弃太多,你需要一条额外的信息 .

    ...

    根据我们下面的讨论,我将首先建议您开发密切相关的递归程序,打印出所需的数字而不缩进 . 那么正确的输出将是:

    6
    5
    4
    3
    2
    1
    

    将该程序更新为处理缩进的程序只是传递一条额外信息的问题 .

    P.S . :这样产生输出的问题几乎不可能为好的测试用例编写,因此不适合做作业 . 我希望你有很多其他不涉及输出的问题....

相关问题