BST打印没有变异?

时间:2012-02-29 23:42:59

标签: printing scheme racket binary-search-tree

所以我基本上想要printbst's ..这里有更多细节

提供一个函数(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 个答案:

答案 0 :(得分:1)

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

从好的方面来说,我喜欢你的缩进功能:)

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

...

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

6
5
4
3
2
1

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

P.S。:这样产生输出的问题几乎不可能写出好的测试用例,因而对作业来说也不是很好。我希望你有很多其他涉及输出的问题....