Java 我的BST中的空指针
我正在尝试一个通过BST运行的“竞赛”,我有通过ect提供的文件输入的玩家实现 实施的基本前提- 计划是使用一个虚拟节点来创建和运行树 左根成为假人,然后假人的左侧是第一个输入的玩家,右侧则指定为假人。 重复该过程,直到有两个团队离开,然后左和右被设置为重新定义的两个团队 下面是我为执行这样的任务而创建的代码Java 我的BST中的空指针,java,binary-search-tree,Java,Binary Search Tree,我正在尝试一个通过BST运行的“竞赛”,我有通过ect提供的文件输入的玩家实现 实施的基本前提- 计划是使用一个虚拟节点来创建和运行树 左根成为假人,然后假人的左侧是第一个输入的玩家,右侧则指定为假人。 重复该过程,直到有两个团队离开,然后左和右被设置为重新定义的两个团队 下面是我为执行这样的任务而创建的代码 public class BT { private Node root; private static class Node { String name
public class BT {
private Node root;
private static class Node {
String name;
int score;
Node left;
Node right;
Node(String newName) {
name = newName;
score = 0;
left = null;
right = null;
}
}
public void BinaryTree(){
root = null;
}
private Node insert(Node node, String player) {
node = new Node(player);
return node; // in any case, return the new pointer to the caller
}
public void setup(ArrayList<String> players, String setup) {
Node dummy = root;
if (setup == "left") {
dummy = dummy.left;
for(int i = players.size()-1; i>=0; i--) {
if(i>2) {
dummy.left = insert(dummy.left, players.get(i));
} else if (i <= 2 ){
dummy = dummy.left;
dummy.left = insert(dummy.left , players.get(i));
dummy.right = insert(dummy.left, players.get(i));
} //end else if
} //end For
} else if (setup == "right") {
dummy= dummy.right;
for(int i = players.size()-1; i>=0 ; i--) {
if(i>2) {
dummy.left = insert(dummy.left, players.get(i));
} else if (i<=2){
dummy = dummy.left;
dummy.left = insert(dummy.left , players.get(i));
dummy.right = insert(dummy.left, players.get(i));
}//end else if
}//end For
} //end if
}
}
公共类BT{
私有节点根;
私有静态类节点{
字符串名;
智力得分;
左淋巴结;
节点权;
节点(字符串newName){
name=newName;
得分=0;
左=空;
右=空;
}
}
公共void二进制树(){
root=null;
}
专用节点插入(节点节点、字符串播放器){
节点=新节点(玩家);
return node;//在任何情况下,将新指针返回给调用方
}
公共无效设置(ArrayList播放器、字符串设置){
节点虚拟=根;
如果(设置=“左”){
dummy=dummy.left;
对于(int i=players.size()-1;i>=0;i--){
如果(i>2){
dummy.left=插入(dummy.left,players.get(i));
}else如果(i=0;i--){
如果(i>2){
dummy.left=插入(dummy.left,players.get(i));
}否则,如果(我似乎解决了我的问题,.equals是一个聪明的改变,我不敢相信我忘记了,所以谢谢你
这似乎是一个简单的想法,我已经实施,以解决,你引发了思想库帕恩塔所以也谢谢你
我太傻了,基本上是崩溃了
1.)已创建根,因此设置dummy.left是有效的。因此,根存在,即使它不存在值left节点。
2.)根中的左节点不是节点本身,因此不会拥有是自己的左节点,因此抛出了一个NPE
我更改的代码如下-
public void setup(ArrayList<String> players, String setup) {
Node dummy;
if (setup.equals("left")) {
dummy = new Node("not played");
root.left = dummy;
dummy = root.left;
System.out.println(dummy.name);
for (int i = players.size() - 1; i >= 0; i--) {
if (i > 1) {
dummy.right = new Node("not played");
dummy = dummy.right;
dummy.left = insert(dummy.left, players.get(i));
dummy = dummy.left;
System.out.println(dummy.name);
}
else if (i <= 2) {
dummy.right = insert(dummy.right, players.get(i));
System.out.println(dummy.right.name);
}
}
}
else if (setup.equals("right")) {
dummy = new Node("not played");
root.right = dummy;
dummy = root.right;
System.out.println(dummy.name);
for (int i = players.size() - 1; i >= 0; i--) {
if (i > 1) {
dummy.right = new Node("right not");
dummy = dummy.right;
dummy.left = insert(dummy.left, players.get(i));
System.out.println(dummy.left.name);
} else {
dummy.right = insert(dummy.right, players.get(i));
System.out.println(dummy.right.name);
}
}
}
}
公共无效设置(ArrayList播放器、字符串设置){
节点虚拟;
if(setup.equals(“左”)){
虚拟=新节点(“未播放”);
root.left=dummy;
dummy=root.left;
System.out.println(虚拟名称);
对于(int i=players.size()-1;i>=0;i--){
如果(i>1){
dummy.right=新节点(“未播放”);
dummy=dummy.right;
dummy.left=插入(dummy.left,players.get(i));
dummy=dummy.left;
System.out.println(虚拟名称);
}
else如果(i=0;i--){
如果(i>1){
dummy.right=新节点(“右非”);
dummy=dummy.right;
dummy.left=插入(dummy.left,players.get(i));
System.out.println(dummy.left.name);
}否则{
dummy.right=插入(dummy.right,players.get(i));
System.out.println(dummy.right.name);
}
}
}
}
这似乎已经破解了它,留下了调试打印输出,所以它们是可忽略的
谢谢大家:)注意:比较像setup.equals(“左”)
和setup.equals(“右”)
这样的字符串。你说的“根的创建”是什么意思你的构造函数设置root=null
-所以root
是null
,然后dummy
是null
,并且null。左=>NullPointerException
我已经有一段时间没有用java编程了。equals更有意义。我现在从讲座中回忆起来,谢谢@nikolasharaldisambidisthat有意义@CupawnTae使用new Node()进行了尝试,当时的问题仍然是空的。我需要某种方法让下一级始终准备好设置非空节点。所有尝试都得到了与现在类似的结果。