2017-02-22 91 views
0

我正在測試以確保可以在我的課程中爲我的項目打印出二進制搜索樹。我擁有它,以便建立一個字符串表達式,並從那裏,程序將字符串拆分成一個數組,並將每個元素插入一個根節點。我調試了程序,它似乎正確地插入了節點,但最後,當程序停止循環時,根節點將最終爲空,並且不允許我打印二叉樹。節點返回爲空

爲什麼我的根節點返回null?我試圖尋找通過該方案,但我不能找到錯誤

Node類

public class Node<T> 
{ 
private T value; 
Node left; 
Node right; 

public Node(T value) 
{ 
    this.value=value; 
    left=null; 
    right=null; 

} 

public String toString() 
{ 
    return value.toString(); 
} 

public T getValue() 
{ 

    return value; 
} 

public Node getLeft() { 
    return left; 
} 

public void setLeft(Node left) { 
    this.left = left; 
} 

public Node getRight() { 
    return right; 
} 

public void setRight(Node right) { 
    this.right = right; 
} 

public void setValue(T value) { 
    this.value = value; 
} 



} 

二叉搜索樹類

import java.io.*; 
import java.util.*; 
public class binarySearchTree<T extends Comparable<T>> 
{ 

private Node<T> root; 




public binarySearchTree() 
{ 
    root=null; 
} 







public Node<T> buildTree(String expression) 
{ 

    String[] expressionSplit=expression.split("\\s{1,}"); 
    binarySearchTree<String> stringBST=new binarySearchTree<String>(); 

    for(int i=0;i<expressionSplit.length;i++) 
    { 
     stringBST.insert(expressionSplit[i]); 
    } 

    return root; 
} 














public Node<T> insertHelper(Node<T> p, T data) 
{ 
    if(p==null) 
    { 

     return new Node<T>(data); 
    } 

    int test=data.compareTo(p.getValue()); 
    if(test==0) 
    { 
     return p; 
    } 
    if(test<0) 
    { 
     p.left=insertHelper(p.left,data); 
    } 
    else if(test>0) 
    { 
     p.right=insertHelper(p.right,data); 
    } 

    return p; 
} 
public void insert(T data) 
{ 
    root=insertHelper(root,data); 
} 
public static String inorder(Node<String> rootString) 
{ 
    if(rootString!=null) 
    { 
     return inorder(rootString.getLeft())+rootString.getValue()+" "+inorder(rootString.getRight()); 
    } 
    return ""; 
} 
public static void main(String[] args) 
{ 
    String expression="10 8 17 4"; 
    binarySearchTree<String>test=new binarySearchTree<String>(); 
    Node<String> root=test.buildTree(expression); 
    System.out.println(test.inorder(root)); 
} 
} 
+0

你留着陰影的'root'變量。每次你寫'Node root',這是一個新的變量,它不會修改或更新你的實例變量'private Node root;' –

+0

你有一個成員'root'和一堆局部變量和參數也被稱爲'root '。使得難以跟蹤你正在玩哪個「根」... – John3136

回答

0

你基本上返回您在聲明的root對象buildTree方法始終爲空。

要解決此問題,請從該方法中刪除Node<T> root = null;

另外,您正在創建一個新的BinarySearchTree對象,它在您的buildTree方法中。因此,得到更新的root對象就是該對象中的對象。

您的main方法中的BinarySearchTree對象原始root永遠不會更新並且始終爲空。

將您的buildTree方法更改爲如下所示。

public Node<T> buildTree(String expression) 
{ 
    T[] expressionSplit = (T[]) expression.split("\\s{1,}"); 
    for (int i = 0; i < expressionSplit.length; i++) 
    { 
     insert(expressionSplit[i]); 
    } 
    return root; 
} 
+0

我刪除了節點 root = null語句,並重命名了我作爲參數傳遞的Node對象,但它仍然表示root爲null – WILLO567

+0

你能用新代碼更新你的問題嗎? – alayor

+0

好的,我的更新後的代碼已經啓動了 – WILLO567

0
public Node<T> insert(Node<T> root, T data) 
{ 

if(root==null) // Problem Use this.root 
{ 
    root= new Node<T>(data); // Same here use this.root = new .... 
    return root; 
} 
...