所以我基本上想要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只打印一个带有一个节点的树....我有一个想法,但它涉及变异,我不能使用:( .....有什么建议吗?我应该改变我对问题的处理方法吗?一起来吗?
答案 0 :(得分:1)
简短回答:是的,你想要或多或少完全重组这个。
从好的方面来说,我喜欢你的缩进功能:)
编写此问题的最简单方法是在子树上进行递归调用。当我告诉你为了打印一个子树时,我希望我不会放弃太多,你需要一条额外的信息。
...
根据我们下面的讨论,我将首先建议你开发一个密切相关的递归程序,打印出所需的数字,没有缩进。那么正确的输出将是:
6 5 4 3 2 1
将该程序更新为处理缩进的程序只是传递一条额外信息的问题。
P.S。:这样产生输出的问题几乎不可能写出好的测试用例,因而对作业来说也不是很好。我希望你有很多其他不涉及输出的问题....