您好
我有一个数组列表,里面有一些数字,如{23,16,45,26,2,5,9}
我想用这个数组列表创建一个二元搜索树"array"
,它的元素是包含2
个字段1)digit2)level
的对象,但在这里我只想使用它的{{1} }}} field。另外digit
是dList
。
这是我的代码,但它会抛出异常。请帮助我,谢谢。
DoublyLinkedList
例外:
private void method(ArrayList<Element> array) {
DNode header = new DNode(null, null, null);
DNode trailer = new DNode(null, header, null);
header.next = trailer;
DNode node = new DNode(array.get(0), header, trailer);
dList.addLast(node);
header = node
for(int i = 1;i<array.size();i++){
makeBST(node, array.get(i));
}
}
private void makeBST(DNode node, Element e) {
if (!e.equals(node.getElement())) {
DNode nodeOne = new DNode(e, null, null);
if (node.getElement().getDigit() > e.getDigit()) {
node.prev = nodeOne;
} else if (node.getElement().getDigit() < e.getDigit()) {
node.next = node;
}
}
if (e.getDigit() < node.getElement().getDigit()) {
makeBST(node.prev, e);
}
makeBST(node.next, e);
}
第一行例外是这行代码:
Exception in thread "main" java.lang.StackOverflowError
at OBST.GreedyVersion.makeBST(GreedyVersion.java:43)
at OBST.GreedyVersion.makeBST(GreedyVersion.java:54)
at OBST.GreedyVersion.makeBST(GreedyVersion.java:54)
at OBST.GreedyVersion.makeBST(GreedyVersion.java:54)
答案 0 :(得分:3)
你的递归方法“private void makeBST(DNode node,Element e)”需要一些类型的结束条件(一个阻止它调用自身的流路径);实际上,它一直以递归方式调用自身,这就是造成堆栈溢出错误的原因。
答案 1 :(得分:1)
您的代码基本上是:
private void makeBST(DNode node, Element e) {
// ... (the rest of your code)
makeBST(node.next, e);
}
这几乎相当于:
private void makeBST(DNode node, Element e) {
while(true) {
// ... (the rest of your code)
node = node.next;
}
}
你刚刚做了一个无限循环(但不是while,而是递归)。因为堆栈大小非常有限,所以经过一些迭代后你会得到StackOverflowError。
但无论如何,如果它只是一个教育实验,那没关系。如果您只需要一个有效的BST,请使用java.util.TreeSet或java.util.TreeMap。
答案 2 :(得分:0)
你有一个StackOverflowError,它指向一个无限的(好的,可能是至少的)递归错误。
P.S。为什么不只使用TreeMap<K,V>
,其中K是数据的索引,V是数据值?
答案 3 :(得分:0)
我可以看到你正在尝试,但距离解决方案还有很长的路要走。
你正在使用递归,所以你需要一个你没有的停止案例。
你也应该拥有if ... else if else而不是你拥有的东西(如果......如果......)
该行if (!e.equals(node.getElement())) {
没有任何意义......
查看关于二叉树和二叉搜索树的维基百科文章......可能会有所帮助。