所以我基本上要printbst的..這裏是一個小更詳細BST打印沒有變異?
提供一個函數(printbst T),打印從BST構成的BST由bst.rkt下面的格式提供:
- 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只打印帶有一個節點的樹你....我有一個想法,但它涉及到突變,這是我不能使用:(?.....任何建議我應該改變我的解決問題的方法一起
是啊,這是我的想法,我需要先打最右邊的節點(最大數量)..打印記住樹的其餘部分...但要記住樹沒有最右邊的節點,然後遞歸它會要求我mutate(使用(set!...))...我不能使用:S ...我如何正確遞解這個? – Thatdude1 2012-03-01 01:03:17
不要擔心先打印第一行;遞歸程序中的驚喜是,如果你照顧你的直系孩子,那麼所有事情都會得到照顧(因爲你的直系孩子會照顧他們的直系子女)。所以問題是這樣的:除了子樹本身,你需要哪些額外的信息來正確地打印子樹?在這個例子中:看看前兩行,對應於左側子樹。左側的子樹包含6個節點和一個5個節點的子節點。哎呀,去下一個評論.... – 2012-03-01 16:43:00
...其實,看到上面的編輯。 – 2012-03-01 16:46:45