2016-10-12 37 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 -java-tree-in-java-question) –

+0

請閱讀有關Java命名約定。類名開始大寫;你不要縮寫(BinaryTree比bstree更好理解,不是它),而你只對_SOME_CONSTANTS使用_ char,而不是用於變量和方法名稱。 – GhostCat

+1

對於下一個問題:您希望我們花時間爲您提供幫助,因此請您花時間妥善格式化您的源代碼。最後:擁有兩個**插入的公共方法只是一個超級混淆的界面(正如你先前看到我錯誤的答案時所看到的那樣)。事情是:你的代碼是**硬**閱讀;儘管它應該如此簡單。最後:您可以輕鬆**自己調試,只需在相關操作之後將打印語句放入您的代碼;或通過運行**調試器**。 – 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

嗨阿西夫,不應該是: –

+0

'code'節點。數據<= N –

+0

'insert_node公共節點(節點節點,整數N,炭目錄,父節點){ \t \t如果(節點== NULL){ \t節點N1 =新節點(N); \t如果(DIR == 'S'){ \t parent.left = N1; \t}否則{\t parent.right = N1; \t}} \t \t否則如果(node.data <= N){ \t父=節點; \t insert_node(node.right,N,R「父); \t \t }否則{ \t父=節點; \t insert_node(node.left,N,「的,親本); \t \t }返回根;' –