【发布时间】:2017-04-10 00:59:32
【问题描述】:
所以我试图通过递归设置每个节点的子节点来平衡二叉搜索树:
public void balanceTheTree(){
root = balance(keys, names);
}
public Node balance(List<Integer> keyList, List<String> nameList){
buildArrays(root);
if(root == null){
return null;
}
else{
int newRootIndex = keyList.size()/2;
Node focusNode = new Node(keyList.get(newRootIndex), nameList.get(newRootIndex));
focusNode.leftChild = balance(keyList.subList(0, newRootIndex), nameList.subList(0, newRootIndex));
focusNode.rightChild = balance(keyList.subList(newRootIndex+1, keyList.size()),nameList.subList(newRootIndex+1, nameList.size()));
return focusNode;
}
}
buildArrays() 使用顺序遍历将树的值(名称)和键(键)存储在它们各自的列表中。 Names 是 List<String>,keys 是 List<Integer>。
不幸的是,平衡在尝试访问列表的任何行都会引发异常。
这是错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.checkForComodification(Unknown Source)
at java.util.ArrayList$SubList.size(Unknown Source)
at BinaryTree.balance(BinaryTree.java:43)
at BinaryTree.balance(BinaryTree.java:45)
at BinaryTree.balanceTheTree(BinaryTree.java:34)
at tester.main(tester.java:30)
第 43 行是int newRootIndex = keyList.size()/2;
谢谢!
public void buildArrays(Node focusNode){
if(focusNode != null){
buildArrays(focusNode.leftChild);
names.add(focusNode.name);
keys.add(focusNode.Key);
buildArrays(focusNode.rightChild);
}
}
【问题讨论】:
-
您使用的列表实现是什么?
-
在方法调用中,传入的列表分别是 ArrayList
和 ArrayList 用于键和名称 -
你能把
buildArrays的代码贴出来吗? -
我添加了方法
标签: java list recursion concurrency concurrentmodification