Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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 我的BST中的空指针_Java_Binary Search Tree - Fatal编程技术网

Java 我的BST中的空指针

Java 我的BST中的空指针,java,binary-search-tree,Java,Binary Search Tree,我正在尝试一个通过BST运行的“竞赛”,我有通过ect提供的文件输入的玩家实现 实施的基本前提- 计划是使用一个虚拟节点来创建和运行树 左根成为假人,然后假人的左侧是第一个输入的玩家,右侧则指定为假人。 重复该过程,直到有两个团队离开,然后左和右被设置为重新定义的两个团队 下面是我为执行这样的任务而创建的代码 public class BT { private Node root; private static class Node { String name

我正在尝试一个通过BST运行的“竞赛”,我有通过ect提供的文件输入的玩家实现

实施的基本前提-

计划是使用一个虚拟节点来创建和运行树

左根成为假人,然后假人的左侧是第一个输入的玩家,右侧则指定为假人。 重复该过程,直到有两个团队离开,然后左和右被设置为重新定义的两个团队

下面是我为执行这样的任务而创建的代码

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()进行了尝试,当时的问题仍然是空的。我需要某种方法让下一级始终准备好设置非空节点。所有尝试都得到了与现在类似的结果。