Java TreeNodes 越界异常

Java Out of bounds exception with TreeNodes

public static void main(String args[])
{
    //creates tree as linked structure
    int lvl = 0;
    LinkedList<TreeNode> lcaTree = new LinkedList<>();
    TreeNode[] charArray = new TreeNode[lcaTree.size()];
    String[] myStringChars = new String[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P",
                                          "Q","R","S","T","U","V","W","X","Y","Z"};

    for(int i = 0; i < 26; i++)
    {
        myStringChars[i] = new String(Character.toChars(i+65));
        System.out.println(myStringChars[i]);
        //reads removed value from queue as an Object; needs to be a TreeNode
    }

    // create the Tree as a linked structure from the array myStringChars
    // the Strings are stored using the representation for trees as arrays in the book
    // (e.g. for an element i, the left child is stored in position 2*i + 1, right child is 
    // on position 2*(i + 1). Also specify the level of a TreeNode

    for (int i = 0; i < myStringChars.length; i++){
        TreeNode parent = null;
        if (i == 0){
            parent = new TreeNode<>("A", null);
            parent.setLevel(lvl);
            lvl++;
        }
        else{
            //set level
            if((i == 3)||(i == 7)||(i == 15)){
                lvl++;
            }
            else if (myStringChars[i].toCharArray()[0]%2 == 1){
                parent = new TreeNode<>(myStringChars[i], lcaTree.get((i/2)-1));
                lcaTree.get((i/2)-1).setRightChild(parent);
                parent.setLevel(lvl);
            }
       *****else{
                parent = new TreeNode<>(myStringChars[i], lcaTree.get(i/2));
                lcaTree.get((i/2)).setLeftChild(parent);
                parent.setLevel(lvl);*****
            }
            lcaTree.add(parent);
        }
    }
    //creates array from tree
    charArray[0] = lcaTree.get(0);
    for (int i = 0; i < charArray.length-1; i++){
        if (2*(i+1) < charArray.length){
            charArray[2*(i+1)] = lcaTree.get(i).getRightChild();
        }
        if ((2*i)+1 < charArray.length){
            charArray[(2*i)+1] = lcaTree.get(i).getLeftChild();
        }
    }
    // create a traversal by levels and print as you traverse to check that the creation of the tree has happened correctly

    for (int i = 0; i < charArray.length; i++){
        System.out.print(charArray[i].getContents());
        if (i==0||(i==2)||(i==6)||(i==14)){
            System.out.println();
        }
    }

大家好。所以这是我正在用 TreeNodes 和基本 Java 做的一个小练习,我 运行 遇到了一个错误,我可以用一些新鲜的眼光来帮助识别。

我在周围放置星号的语句中遇到越界异常。我不知道为什么 i/2 会导致越界情况,因为 0/2 是 0 和 26/2 returns 13(min/max i 值),两者都不是哪些是越界的。

任何人都可以提供一些进一步的见解吗?提前致谢。

蒂姆

i=0 迭代中,您在 if(i==0) 块中创建了根节点,但尚未将其添加到 lcaTree

在你的 elselcaTree.get(0) 中的下一次迭代 i = 1 将抛出 OutOfBounds 因为你在位置 0 上没有任何内容,你的数组是零长度。

所以,修复你的 for 循环:

   for (int i = 0; i < myStringChars.length; i++){
        TreeNode parent = null;
        if (i == 0){
            parent = new TreeNode<>("A", null);
            parent.setLevel(lvl);
            lvl++;
        }
        else{
            //set level
            if((i == 3)||(i == 7)||(i == 15)){
                lvl++;
            }
            else if (myStringChars[i].toCharArray()[0]%2 == 1){
                parent = new TreeNode<>(myStringChars[i], lcaTree.get((i/2)-1));
                lcaTree.get((i/2)-1).setRightChild(parent);
                parent.setLevel(lvl);
            }
            else{
                parent = new TreeNode<>(myStringChars[i], lcaTree.get(i/2));
                lcaTree.get((i/2)).setLeftChild(parent);
                parent.setLevel(lvl);
            }
            lcaTree.add(parent); //<--- move out!
        }
    }

并把 lcaTree.add(parent); 放在 else 条件之外?

    for (int i = 0; i < myStringChars.length; i++){
        TreeNode parent = null;
        if (i == 0){
            parent = new TreeNode<>("A", null);
            parent.setLevel(lvl);
            lvl++;
        }
        else{
            //set level
            if((i == 3)||(i == 7)||(i == 15)){
                lvl++;
            }
            else if (myStringChars[i].toCharArray()[0]%2 == 1){
                parent = new TreeNode<>(myStringChars[i], lcaTree.get((i/2)-1));
                lcaTree.get((i/2)-1).setRightChild(parent);
                parent.setLevel(lvl);
            }
            else{
                parent = new TreeNode<>(myStringChars[i], lcaTree.get(i/2));
                lcaTree.get((i/2)).setLeftChild(parent);
                parent.setLevel(lvl);
            }
        }
        lcaTree.add(parent); // <- like so!
    }