节点返回为空
问题描述:
我正在测试以确保可以在我的课程中为我的项目打印出二进制搜索树。我拥有它,以便建立一个字符串表达式,并从那里,程序将字符串拆分成一个数组,并将每个元素插入一个根节点。我调试了程序,它似乎正确地插入了节点,但最后,当程序停止循环时,根节点将最终为空,并且不允许我打印二叉树。节点返回为空
为什么我的根节点返回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));
}
}
答
你基本上返回您在声明的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;
}
答
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;
}
...
你留着阴影的'root'变量。每次你写'Node root',这是一个新的变量,它不会修改或更新你的实例变量'private Node root;' –
你有一个成员'root'和一堆局部变量和参数也被称为'root '。使得难以跟踪你正在玩哪个“根”... – John3136