2013-05-07 161 views
0

我想實現一個二叉樹,但它只是沒有根。有任何想法嗎?它看起來像根應該插入很好,但我打印時它只是空。我是否只將臨時節點添加到不「粘」的樹上?實現二叉樹

public class tree { 
    public static void main(String args[]){ 
     Treeb tree = new Treeb(); 
     tree.add(10); 
     tree.add(20); 
     tree.add(2); 
     tree.add(6); 
     tree.printTree(); 
    } 
} 
class Node{ 
    int data; 
    Node left; 
    Node right; 
    public Node(int data){ 
     this.data = data; 
     left = null; 
     right = null; 
    } 
    Node getLeft(){ 
     return left; 
    } 
    Node getRight(){ 
     return right; 
    } 
} 

class Treeb{ 
    Node root; 
    Treeb(){ 
     root = null; 
    } 

    void add(int n){ 
     addNode(n, root); 
    } 

    void addNode(int n, Node vert){ 
     if(vert == null){ 
      vert = new Node(n); 
     } 
     else if(vert.left.data < n){ 
      if(vert.left == null){ 
       vert.left = new Node(n); 
      } 
      else{ 
       addNode(n, vert.left); 
      } 
     } 
     else if(vert.right.data >= n){ 
      if(vert.right == null){ 
       vert.right = new Node(n); 
      } 
      else{ 
       addNode(n,vert.right); 
      } 
     } 
    } 
    void printTree(){ 
     if(root != null){ 
      printChild(root); 
     } 
     System.out.println(root); 
    } 
    void printChild(Node leaf){ 
     System.out.print(leaf.data); 
     if(leaf.left != null){ 
      printChild(leaf.getLeft()); 
     } 
     if(leaf.right != null){ 
      printChild(leaf.getRight()); 
     } 
    } 
} 
+2

嗨,答案旁邊的兩個(小)評論:類名以大寫字母開頭,如果你有時使用修飾符如private,它應該很好。此外,當您創建getters(getLeft()和getRight())時,使用它們代替實例變量總是一個好主意。 (當然,這是因爲你沒有使用'私人'修飾符而成爲可能。) – 2013-05-07 07:42:56

回答

3

您的方法addNode(int, Node)不起作用。

第一:

if(vert == null){ 
    vert = new Node(n); 
} 

你指定新節點到當地變量。因此,該方法結束時將丟棄新的節點。

二:

} 
else if(vert.left.data < n){ 
    // code 
} 
else if(vert.right.data >= n){ 

vert.leftvert.right可以null,所以你會得到一個NPE時vertnull

3

getLeft()getRight()可以(將)返回null一段時間。您應該確保您的printChild()leaf本身不是null。 (你可能得到NPEif(leaf.left != null)因爲leafnull),你可能還想重新考慮你的樹構造,rootnull你的情況。

4

您正在分配vert一個新的參考,但不是root,這就是爲什麼它保持null