所以我基本上想要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 回答
简短的回答:是的,你想要或多或少完全重组这个 .
好的一面,我喜欢你的缩进功能:)
编写此问题的最简单方法是在子树上进行递归调用 . 我希望当我告诉你为了打印一个子树时,我不会放弃太多,你需要一条额外的信息 .
...
根据我们下面的讨论,我将首先建议您开发密切相关的递归程序,打印出所需的数字而不缩进 . 那么正确的输出将是:
将该程序更新为处理缩进的程序只是传递一条额外信息的问题 .
P.S . :这样产生输出的问题几乎不可能为好的测试用例编写,因此不适合做作业 . 我希望你有很多其他不涉及输出的问题....