2012-02-25 36 views
1

私はJavaでバイナリ検索ツリーを開発しています。しかし、私はそれにある程度の困難に直面しています。ここにコードがありますJavaバイナリ検索ツリーの実装に問題があります。

私が直面している問題は、値段で渡すだけです。私はそれが新しく作成されたルートを渡した最初のケ​​ースを除いて、すべてのケースでnullとしてルートを取得しています。ここで私は挿入関数の再帰呼び出しを作成しているときには、ルートの左または右の値を渡して、新しい呼び出しでは新しいルートが必要に応じて作成されていますが、関数がオーバーしたときにその値は反映されません呼び出し元関数の変数に渡します。 要するに、この問題は、Javaによる値の呼び出しが原因で発生します。

誰でもこの問題の解決策を提案できますか?

+0

あなたの問題は、あなたがヌル値を "変更"しようとしていることにあります – WuHoUnited

+0

また、最初の挿入メソッドがdを2回挿入しようとしていることに気付いていますか? – WuHoUnited

答えて

4

insert(root.right/left, d)へのあなたの呼び出し、彼らがnullの場合、元の左/右のノードを変更、単にJavaであなたが気づいたように、新しい変数(へメソッドの引数ポイントがありませんが変更されることはありません元の参照)。最初のルートへの変更は、別のメソッドinsert(int)を呼び出すために機能します。

Nodeの代わりに左右BinaryTreeを使用しましたか?また、 "null"を使用する代わりに、 "空の" BinaryTree(NULLルートとisEmptyメソッド)を持つことを検討してください。

概念的にはです。左と右はノードではなくツリーなので、デザインはよりクリーンになります。


コード例。テストされていないが、アイデアは、右のようになります。

class Node { 

    BinaryTree left, right; 
    Integer data; 

    Node(Integer d, BinaryTree left, BinaryTree right) { 
     this.data = d; 
     this.left = left; 
     this.right = right; 
    } 
} 

class BinaryTree { 

    Node root; 

    // Empty tree 
    BinaryTree() { 
     this(null); 
    } 

    BinaryTree(Node root) { 
     this.root == root; 
    } 

    void insert(int d) { 

     if (this.root == null) { 

      // The tree was empty, so it creates a new root with empty subtrees 
      this.root = new Node(d, new BinaryTree(), new BinaryTree()); 

     } else if (d > this.root.data) { 
      this.root.right.insert(d); 
     } else if (d < this.root.data) { 
      this.root.left.insert(d); 
     } 
    } 
} 

注:

  • を私はあなたの既存のコードのスタイルを尊重しました。
  • この実装は、繰り返し要素をスキップします。
+0

できるだけ最適なプログラムにする必要があります。また、あなたが提案しているソリューションのコードサンプルをいくつか教えていただけますか?私が直面している問題は、再帰呼び出しが完了したときに関数内の値を反映しない値による呼び出しです。 – ankurtr

+0

@ ankur.trapasiya私は例を追加しました。私はそれを試していないのでエラーが発生する可能性がありますが、動作する必要があります。 –

+0

はいそうです。私はmodity root == nullの状態にしなければならないが、それは大丈夫です...ありがとう.. :-) – ankurtr

1

提案、

  • あなたがint値を使用することを意味している場合、私はIntegerを使用していないだろう。
  • 既にJVMにあるコードを再生成する場合は、コードが最初にどのように動作するかをお読みください(必要なものをコピーしてください)
  • 私のコードにバグがあるときは、何がうまくいかない。
  • 私は問題を示す最も単純なユニットから始め、その単純な状況を修正します。

誰かが再現できる最も簡単な単体テストと、それが意味をなさない場合はここでデバッガに表示されているものを投稿します。

これは本当にあなたの質問に答えるものではありませんが、コメントには長すぎます。 ;)

+0

実際に私はこのプログラムをC++で作っていますが、私はjavaにもっと慣れています。今、javaは構造体のようなポインタを持たないので、バイナリツリーを作るために何をしなければならないのですか?再帰呼び出しが終了するたびに新しい値が反映されないためです。私はデバッグして、デバッグだけで私はなぜそれが起こっていない理由に来た。私はちょうどこれを行うためにjavaに任意の方法があるのですか?私はコードを求めていません。ちょうどヒントだけで十分です。 – ankurtr

+0

コードはTreeMapクラスに含まれているので、それを行うことができます。私はあなたにそれを与える必要はありません。 –

+0

はい、私はそれを試しました。それはまた働いていますが、私はバイナリ検索ツリーのためのプログラムを開発しようとしています。ありがとう: - )... !!!!! – ankurtr

関連する問題