2017-02-22 5 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メソッドは常にnullです。

この問題を解決するには、その方法のNode<T> root = null;を削除してください。

さらに、buildTreeメソッドで新しいBinarySearchTreeオブジェクトを作成しています。したがって、更新されたrootオブジェクトは、そのオブジェクト内のオブジェクトです。

mainメソッドのBinarySearchTreeの元のrootオブジェクトは更新されず、常にnullです。

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; 
} 
... 
関連する問題