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
。
在你的 else
块 lcaTree.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!
}
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
。
在你的 else
块 lcaTree.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!
}