2017-02-22 33 views
0

Я тестирую, чтобы убедиться, что могу распечатать свое двоичное дерево поиска для проекта в своем классе. У меня это так, что строковое выражение установлено, и оттуда программа разделит строку на массив и вставляет каждый элемент в корневой узел. Я отлаживал программу и, кажется, правильно вставлял узлы, но в конце, когда программа перестает зацикливаться, корневой узел будет иметь значение null и не позволит мне печатать двоичное дерево.Узел возвращается как null

Почему мой корень Node возвращает 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 '. Делает это трудно, чтобы отслеживать, какой «root» вы играете с ... – John3136

ответ

0

Вы в основном возвращение root объекта, который объявлен в buildTree метод, который всегда равен нулю.

Чтобы устранить это, удалите Node<T> root = null; из этого метода.

Кроме того, вы создаете новый объект BinarySearchTree, который в вашем методе buildTree. Таким образом, объект root, который обновляется, является тем объектом в этом объекте.

Исходный объект root от BinarySearchTree в вашем методе main никогда не обновляется, и он всегда равен нулю.

Измените способ 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

Я удалил Node корневой = нулевой оператор, а также переименовал объекты 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; 
} 
...