2012-02-29 19 views
0

だから私は基本的にのをprintbstしたい...ここで少し詳しくは突然変異のないBST印刷ですか?

次の形式でbst.rktによって提供されるようにBSTから構築BSTを表示する関数(printbstトン)提供:

を - 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

短い答え:?。はい、あなたは多かれ少なかれ完全にこれを再構築したいとしているが

明るい側では、私はあなたのインデント関数が好きです:)

この問題を書き込む最も簡単な方法は、サブツリーに対して再帰呼び出しを行うことです。私は、サブツリーを印刷するために必要な情報が1つ余分にあることを私が伝えると、あまりにも多くをあきらめないことを願っています。

...以下の私たちの議論に基づいて

は、私が最初にあなたがいないインデントで希望の数字を出力し、密接に関連し、再帰的プログラムを開発することを示唆しているつもりです。それでは正しい出力は次のようになります。

 
6 
5 
4 
3 
2 
1 

インデントを扱うものにそのプログラムの更新情報の単一余分な部分に沿って通過するだけの問題です。

P .:出力を生成するこのような質問は、テストケースを書くのがほとんど不可能であり、結果的に宿題にはあまり適していません。 には出力が含まれていません...

+0

これは私が考えていたことです、私は最初に右端のノード(最大番号)を押す必要があります..ツリーの残りの部分を覚えていることを印刷する...しかし、最も右のノードがないツリーを覚えていて、それを再帰すると、私はmutate(use(set!...))...を使う必要があります。 ...どうすればこれを適切に再現できますか? – Thatdude1

+0

最初の行を最初に印刷する心配はありません。再帰的なプログラムでの驚きは、あなたの直系の子供を世話するならば、すべてが世話をしてしまうことです。ですから問題はこれです:サブツリーを正しく印刷するためには、サブツリー自体の横に*追加*情報が必要ですか?この例では、左のサブツリーに対応する最初の2行を見てみましょう。左のサブツリーには6のノードがあり、5つの子が1つ含まれています。おっと、次のコメントに行く.... –

+0

...実際には、上の編集を参照してください。 –

関連する問題