Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 节点返回为null_Java_Binary Search Tree_Nodes - Fatal编程技术网

Java 节点返回为null

Java 节点返回为null,java,binary-search-tree,nodes,Java,Binary Search Tree,Nodes,我正在测试,以确保我可以打印出我的二元搜索树的项目在我的类。这样就建立了一个字符串表达式,从那里开始,程序将字符串分割成一个数组,并将每个元素插入根节点。我已经调试了这个程序,它似乎正确地插入了节点,但在最后,当程序停止循环时,根节点将最终为null,并且不允许我打印二叉树 为什么我的根节点返回null?我试着看了一下程序,但找不到错误 节点类 public class Node<T> { private T value; Node left; Node right; public

我正在测试,以确保我可以打印出我的二元搜索树的项目在我的类。这样就建立了一个字符串表达式,从那里开始,程序将字符串分割成一个数组,并将每个元素插入根节点。我已经调试了这个程序,它似乎正确地插入了节点,但在最后,当程序停止循环时,根节点将最终为null,并且不允许我打印二叉树

为什么我的根节点返回null?我试着看了一下程序,但找不到错误

节点类

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;
}



}
公共类节点
{
私人T值;
左淋巴结;
节点权;
公共节点(T值)
{
这个。值=值;
左=空;
右=空;
}
公共字符串toString()
{
返回值.toString();
}
公共T getValue()
{
返回值;
}
公共节点getLeft(){
左转;
}
公共void setLeft(节点左侧){
this.left=左;
}
公共节点getRight(){
返还权;
}
公共无效设置权限(节点权限){
这个。右=右;
}
公共无效设置值(T值){
这个值=值;
}
}
二叉搜索树类

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));
}
}
import java.io.*;
导入java.util.*;
公共类二进制搜索树
{
私有节点根;
公共二进制搜索树()
{
root=null;
}
公共节点构建树(字符串表达式)
{
String[]expressionSplit=expression.split(\\s{1,}”);
binarySearchTree stringBST=新的binarySearchTree();

对于(inti=0;i您基本上返回了在
buildTree
方法中声明的
root
对象,该对象始终为空

要修复此问题,请从该方法中删除
节点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;
}
公共节点构建树(字符串表达式)
{
T[]expressionSplit=(T[])expression.split(\\s{1,});
for(int i=0;i
公共节点插入(节点根,T数据)
{
如果(root==null)//出现问题,请使用this.root
{
root=new Node(data);//此处相同使用this.root=new。。。。
返回根;
}
...

您一直跟踪
根变量
。每次写入
节点根
,这是一个新变量,不会修改或更新实例变量
私有节点根;
您有一个成员
和一组局部变量和参数,也称为
。这使得跟踪变得很困难其中k个
root
您正在玩…我删除了Node root=null语句,并重命名了作为参数传递的节点对象,但它仍然表示root为null
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;
}
...