だから私は基本的にのを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は、一つのノードのみなたでツリーを表示します....私はアイデアを持っていますが、それは私が使用できない変異を伴う:(.....任意の提案私はすべて一緒にこの問題に対する私のアプローチを変更する必要があります
これは私が考えていたことです、私は最初に右端のノード(最大番号)を押す必要があります..ツリーの残りの部分を覚えていることを印刷する...しかし、最も右のノードがないツリーを覚えていて、それを再帰すると、私はmutate(use(set!...))...を使う必要があります。 ...どうすればこれを適切に再現できますか? – Thatdude1
最初の行を最初に印刷する心配はありません。再帰的なプログラムでの驚きは、あなたの直系の子供を世話するならば、すべてが世話をしてしまうことです。ですから問題はこれです:サブツリーを正しく印刷するためには、サブツリー自体の横に*追加*情報が必要ですか?この例では、左のサブツリーに対応する最初の2行を見てみましょう。左のサブツリーには6のノードがあり、5つの子が1つ含まれています。おっと、次のコメントに行く.... –
...実際には、上の編集を参照してください。 –