2012-02-29 66 views
0

所以我基本上要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只打印帶有一個節點的樹你....我有一個想法,但它涉及到突變,這是我不能使用:(?.....任何建議我應該改變我的解決問題的方法一起

回答

1

簡短的回答:是的,你會想重組這或多或少完全

在光明的一面。 ,我喜歡你的縮進功能:)

寫這個問題最簡單的方法是在子樹上進行遞歸調用。當我告訴你,爲了打印一個子樹,我希望我不會放棄太多,你需要一個額外的信息。

...

根據我們下面的討論,我會首先建議您開發密切相關的遞歸程序,打印出所需的數字與無壓痕。所以,那麼正確的輸出將是:

 
6 
5 
4 
3 
2 
1 

更新該程序到處理縮進只是沿着一個額外的一條信息傳遞的問題之一。

P.S .:像這樣的產生輸出的問題幾乎不可能寫出好的測試用例,因此對於作業來說不是很好。我希望你的緣故,你有很多其他問題,不要涉及輸出....

+0

是啊,這是我的想法,我需要先打最右邊的節點(最大數量)..打印記住樹的其餘部分...但要記住樹沒有最右邊的節點,然後遞歸它會要求我mutate(使用(set!...))...我不能使用:S ...我如何正確遞解這個? – Thatdude1 2012-03-01 01:03:17

+0

不要擔心先打印第一行;遞歸程序中的驚喜是,如果你照顧你的直系孩子,那麼所有事情都會得到照顧(因爲你的直系孩子會照顧他們的直系子女)。所以問題是這樣的:除了子樹本身,你需要哪些額外的信息來正確地打印子樹?在這個例子中:看看前兩行,對應於左側子樹。左側的子樹包含6個節點和一個5個節點的子節點。哎呀,去下一個評論.... – 2012-03-01 16:43:00

+0

...其實,看到上面的編輯。 – 2012-03-01 16:46:45