2

アルゴリズムは理解していますが、スキームを使用してコードを機能させることができません。二分探索木を構築しています。ノードは(キー値)のペアです。Javaでは、コードは正常に機能します。

public void inOrder(BinaryNode n) {
    if (n != null) {
        inOrder(n.left);
        System.out.println(n.value);
        inOrder(n.right);
    }
}

スキームでは、私の開始コードは次のとおりです。

(define empty ())

(define empty? null?)

(define (node_key tn) (list-ref tn 0))

(define (node_val tn) (list-ref tn 1))

(define (node_left tn) (list-ref tn 2))

(define (node_right tn) (list-ref tn 3))

(define (tree-node key value left right) (list key value left right))

(define (get-key tn) (node_key tn))

(define (get-val tn) (node_val tn))

(define (get-left tn) (node_left tn))

(define (get-right tn) (node_right tn))

(define (get-pair tn) (list (get-key tn) (get-val tn)))

(define (atom? tn) (and (empty? (get-left tn)) (empty? (get-right tn))))

(define (printInOrder  t)
  (if (not (empty? t))       
      (begin
        (printInOrder (get-left t))
        (get-pair t)
        (printInOrder (get-right t))
        )
      )
  ) 

ただし、printInOrderをテストする場合:

(define a (tree-node 3 30 empty empty))

(define b (tree-node 1 10 empty empty))

(define c (tree-node 2 20 b a))

(printInOrder  c)

印刷する必要があります:

1 10
2 20
3 30

しかし、それは機能しません、何も印刷しません。

誰かがこの問題を手伝ってもらえますか?ありがとう。

4

2 に答える 2

1

あなたが書いたコードは、次のものとほぼ同等です。

public void inOrder(BinaryNode n) {
    if (n != null) {
        preOrder(n.left);
        n.value;
        preOrder(n.left);
    }
}

(... ただし、Java はおそらくネイキッドn.valueを構文エラーとして扱います。これは、興味深いものに使用されていないためです。)

値がトップレベルに到達しない限り、式は自動的に値を出力しません。それ以外の場合は、値を明示的に出力する必要があります。displaynewlineを使用して、 System.out.printlnの効果を得ることができます。Racket を使用している場合は、printfも使用できます。

于 2012-10-02T15:31:47.920 に答える
0

アラン、Java コーダーの場合、トップレベルの環境に多くの機能を散らかしています。次のようなノード オブジェクトを考えてみましょう。

    (define make-node
      (lambda (key value)
        (let ((left '()) (right '()))
          (lambda (m)
            (cond
              ((eq? m 'key) key)
              ((eq? m 'value) value)
              ((eq? m 'left) left)
              ((eq? m 'right) right)
              ((eq? m 'set-left) (lambda (x) (set! left x)))
              ((eq? m 'set-right) (lambda (x) (set! right x)))
              (else (error "Error (make-node): unknown op " m)) )))))

もちろん、本格的なツリーを作成するには、これよりも少し多くのものが必要です。少なくとも挿入メソッドを備えたリストオブジェクトが必要です(手動で行うと、ツリーの任意のポイントで間違ったノードを誤って「左」または「右」に配置する可能性があります)。また、ツリー オブジェクトに list-in-order メソッドを追加して、キーと値のペアのリストを返すと、リストを使って何でもできます (表示を含む)。

それがツリーを構築する最良の方法だとは言いませんが、よりクリーンです。

于 2012-10-02T22:08:55.807 に答える