简体   繁体   English

BST中的空指针

[英]Null pointers in my BST

I am attempting a 'competition' that is run through a BST, i have implementation of players that are entered through a file provided ect ect. 我正在尝试通过BST运行“竞争”,我实现了通过提供的文件输入的播放器的实现。

Basic Premisiss of Implementation- 实施的基本前提-

The plan is to use a dummy node for creation and running the tree. 计划是使用一个虚拟节点来创建和运行树。

roots left becomes the dummy , then the left of the dummy is the first player entered, the right then assigned as dummy. 左边的根成为假人,然后假人的左边是第一个进入的玩家,右边的人则被指定为假人。 The process is repeated untill there are two teams left, then left and right are set to the remianing two teams. 重复该过程,直到剩下两支球队,然后将左和右分别设置为重新支配的两支球队。

Below is the code i have created to preform such a task! 以下是我为执行此任务而创建的代码!

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

However when i run this class i am getting Null Pointer on the first dummy = dummy.left; 但是,当我运行此类时,我在第一个dummy = dummy.left;上获得了空指针dummy = dummy.left;

I understand there is nothing there persay but a node left of root does exist due to creation of the root itself surely? 我知道这里没有任何内容,但是由于肯定创建了根本身,根的左边是否存在节点?

If anyone can highlight stupid errors i would greatly appreciate it. 如果有人可以突出显示愚蠢的错误,我将不胜感激。

(I understand the method in inputting players is a little odd but it should give the result i wish for, although not the normal method for inputting data to a tree.) (我知道输入玩家的方法有点奇怪,但是它应该能提供我想要的结果,尽管不是将数据输入到树上的常规方法。)

Seemed to fix the problem i was having, .equals was a smart change i cant believe i forgot about that so thank you. 似乎可以解决我遇到的问题,.equals是一个明智的改变,我简直不敢相信自己忘记了,所以谢谢。

It seems like a simple idea i have implemented to fix, and you sparked the thought CupawnTae so thank you also. 这似乎是我已解决的一个简单想法,您激发了CupawnTae的想法,所以也谢谢您。

I was being silly and the break down was essentially. 我很傻,而且本质上是崩溃。

1.) Root was created, so setting dummy.left was valid. 1.)根已创建,因此设置dummy.left有效。 Root existed therefore even though it had not value left node existed. 因此,即使根节点没有价值,根也存在。 2.)Left node from the root was not a node itself, so would not own is own left node so threw a NPE. 2.)根的左节点本身不是节点,因此不会拥有自己的左节点,因此抛出了NPE。

code of what i changed is below - 我更改的代码如下-

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

}

This seems to have cracked it, left debugging printouts in so they are ignoreable. 这似乎已经破解了,只保留了调试打印输出,因此可以忽略它们。

Thank you all :) 谢谢你们 :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM