2016-10-12 9 views
1

バイナリ検索ツリーで挿入と印刷を実装するとします。最初のルートノードのみが出力されます。なぜ助けてください?バイナリ検索ツリーの基本的な実装。学習に始まり、より高度なものに移行しますが、最初のステップでは迷ってしまいます。ルートノードにノードを追加していないようです。バイナリ検索ツリーに挿入することができません

class bstrees{ 
class Node 
{ 
    int data; 
    Node left; 
    Node right; 
    public Node(int data) 
    { 
     this.data=data; 
     this.left=null;  
     this.right=null; 
    } 
} 
Node root; 
bstrees(){root=null;} 

public void insert(int data){ 
    root=insert_node(root,data); 
} 
public Node insert_node(Node r,int n){ 
    if(r==null){ 
     Node n1=new Node(n); 
     //root=n1; 
     return n1 ; 
    } 
    else if(root.data<=n){ 
     insert_node(root.right,n); 
    } 
    else{ 
     insert_node(root.left,n); 
    } 
    return r; 
} 
public void print_t(){ 
    print_t(root); 
} 
private void print_t(Node r){ 
    //System.out.println(r); 
    if(r!=null){ 

    // System.out.println(r.left);   
    // System.out.println(r.right); 
     print_t(r.left); 
     System.out.println(r.data+" "); 
     print_t(r.right); 
    } 

} 


} 
public class BST_prac { 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    bstrees b1=new bstrees(); 
    b1.insert(5); 
    b1.insert(1); 
    b1.print_t(); 

} 

} 

それだけ5

+0

最初に一見/テストコードではないようですが、最初にnullをチェックしたいと思うかもしれません。[こちら](http://stackoverflow.com/questions/5560679/inserting-nodes-into-a) -binary-tree-in-java-question) –

+0

Java命名規則についてお読みください。クラス名は大文字で始まります。省略しないでください(BinaryTreeはbstreeよりもはるかに理解しやすい)、SOME_CONSTANTSでは_charのみを使用しますが、変数やメソッド名では使用しません。 – GhostCat

+1

そして、次の質問:私たちが時間を費やしてあなたを助けてくれるようにしたいので、ソースコードを適切にフォーマットする時間を費やしてください。最後に、**挿入することに関する** 2つの**公開メソッドを持つことは、(私が間違った答えを最初に与えたように見たように)単純には非常に混乱しやすいインターフェースです。あなたのコードは**読みにくいです**。それはとても簡単ではありません。最後に、関連するアクションの後にコードにprintステートメントを置くだけで、簡単に**デバッグできます。または**デバッガ**を実行してください。 – GhostCat

答えて

3

ツリーに値1を挿入コールでのプリントアウト、insert_node(root.left,n)の呼び出しが新しいノードを作成し、この新たに作成されたノードへの参照が格納されていない、そのツリー自体が効果的に変更されないことを意味します。参照は、新しく作成されたノードの親ノードに格納される必要があります。右のサブツリーにノードを挿入する場合も同様です。

+0

それを気に入ってくださいCodor。コードを以下に変更し、正しく挿入して印刷しています。 –

+0

パブリック・ノードinsert_node(ノードR、int型N){ \t \t場合(R == NULL){ \t \t \tノードN1 =新しいノード(N)。 \t \t \t return n1;他 \t \t} \t \t(root.data <= N){ \t \t \t root.right = insert_node(root.right、N)の場合。他 \t \t} \t \t { \t \t \t root.left = insert_node(root.left、N)。 \t \t} \t \t return r; –

+1

@varunjanaしないでください。彼の答えが右折したら、それを受け入れてください。読み込み不能なコメントにコードを詰めることには何の意味もありません。 – GhostCat

0

Codorで説明したように新しいノードを挿入する場合、左ノードまたは右ノードに追加するかどうかのように、親ノードの参照を格納していません。常に新しいノードを作成しています。私はあなたのコードを挿入メソッドで動作させるために少しの変更を加えました。

public void insert(int data){ 
     //creating root node if root node itself is null 
     if(root==null){ 
      root =new Node(data); 
     } else { 
      root=insert_node(root, data, null, null); 
     } 
     //System.out.println("after insert root data is " + root.data); 
    } 
    public Node insert_node(Node node, int n, String dir, Node parent){ 
     //traverse and insert in proper nodes 
     //assign left or right child based on some logic i have taken direction as string here. 
     if(node == null) { 
      Node n1 = new Node(n); 
      if(dir.equalsIgnoreCase("left")) { 
       parent.left = n1; 
      } else { 
       parent.right = n1; 
      } 
     } 
     else if(root.data<=n){ 
      parent = root; 
      insert_node(root.right, n, "right", parent); 
     } 
     else{ 
      parent = root; 
      insert_node(root.left, n, "left", parent); 
     } 
     return root; 
    } 
+0

こんにちはAsif、そうでなければなりません: –

+0

'code'ノード。data <= n –

+0

'public node insert_node(ノードノード、int n、charディレクトリ、ノード親){ \t \t if(node == null){ \tノードn1 =新しいノード(n); \t if(dir == 'l'){ \t parent.left = n1; \t} else { \t parent.right = n1; \t} \t}そう \t IF(node.data <= N){ \t親=ノード。 \t insert_node(node.right、n、 'r'、parent); \t} \t else { \t parent = node; \t insert_node(node.left、n、 'l'、parent); \t} \t return root; ' –

関連する問題