2016-09-22 2 views
0

私はJavaを学んでいます。私は、Javaでの参照とC++での参照/ポインタの違いを理解するために、基本バイナリ検索を実装しようとしました。Javaでの参照

実装は

class Node{ 
    public int value; 
    public Node left; 
    public Node right; 
    Node(int v){ 
     this.value = v; 
     this.left = null; 
     this.right = null; 
    } 
} 
class binarySearch{ 
    public Node root; 
    public Node insert(int value , Node r){ 
     if(r == null){ 
      return new Node(value); 
     } 
     if(r.value < value){ 
      r.left = insert(value , r.left); 
     }else{ 
      r.right = insert(value , r.right); 
     } 
     return r; 
    } 
    public void insertIt(int v){ 
     this.root = insert(v , this.root); 
    } 
    binarySearch(){ 
     this.root = null; 
    } 
} 

binarySearch b = new binarySearch(); 
b.insertIt(5); 
b.insertIt(6); 
Node p = b.root; 
while(p != null){ 
    System.out.println("Hi :" + p.value); 
    p = p.right; 
} 

(再帰を使用して)次のようであるが、左と右のノードがnullのままです。再帰は、新しく作成されたノードへの参照を戻さないので、値はルートノードの左/右ノードに挿入されません。

なぜJavaでこれが起こっていますか?再帰と参照のための特別な方法はありますか、またはJavaでリファレンスがどのように正確に機能していますか?

ご協力ありがとうございます。

+0

[Javaが「参照渡し」または「渡し渡し」ですか?」(http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or) -pass-by-value) – Mordechai

+1

@MouseEventいいえこれはロジックの問題です。 – jonhopkins

+0

@trolkura上記のコードで出力されるものを正確に*含むことができますか?左/右のノードがnullのままになっていることをどのように知っていますか?上のコードは正しいノードのみをチェックします。ルートノード、左ブランチ、および右右ブランチを持つツリーを作成することを除いては –

答えて

2

ロジックを入れ替えました。 insert()機能で:

if (r.value < value) { 
    r.left = insert(value, r.left); 
} else { 
    r.right = insert(value, r.right); 
} 

は次のようになります。

if (r.value > value) { 
// or if (value < r.value) { 
    r.left = insert(value, r.left); 
} else { 
    r.right = insert(value, r.right); 
} 

それが今であるとして、あなたは左のノードに6を挿入しているので、あなたが印刷しているときには表示されません。木。

+0

私は遅れをとって、ありがとう:) – Darlyn

+1

lol nah、私たちはすべて時々そのような間違いを犯す – jonhopkins