我有两个类,BSTSet和BSTNode,它们都有一个返回高度的height()方法。我收到了stackoverflow错误,并且不确定导致它的原因。
BSTSet
public class BSTSet <E extends Comparable<E>> extends AbstractSet <E> {
// the root of the supporting binary search tree
private BSTNode<E> root;
// number of elements in the set
private int count = 0;
public boolean isEmpty() {
return count == 0;
}
public int size() {
return count;
}
public int height() {
if(root == null) return -1;
else return root.height();
}
}
BSTNode
public class BSTNode <E extends Comparable<E>> {
private E value;
private BSTNode<E> left;
public BSTNode<E> right;
public BSTNode(E value) {
this.value = value;
}
public E getValue() {
return value;
}
public BSTNode<E> getLeft() {
return left;
}
public BSTNode<E> getRight() {
return right;
}
public int height() {
if(left == null && right == null) return 0;
if(left != null && right == null) {UI.println("left");return left.height()+ 1; }
else if(right != null && left == null){UI.println("right");return right.height()+ 1;}
else{UI.println("both"); return Math.max(right.height(), left.height()) + 1;}
}
}
如果您想要更多代码或需要更多信息,请随时提出。
答案 0 :(得分:1)
问题是您的递归height()
方法正在height()
上调用this
。这不是算法应该如何工作,并且它是无限递归循环的明显原因,它会给你堆栈溢出。
height
方法可以实现为O(logN)
而不是O(N)
。
我怀疑你原来的方法是O(logN)
...
答案 1 :(得分:0)
if(left == null && right == null) return 0;
更改为
if(left == null && right == null) return 1;
如果某个节点没有子节点,则其高度仍为1
然后就这样做一个递归调用
else return Max(left.height(), right.tHeight) + 1;
根据定义,节点的高度是它的子发辫的最大高度+ 1
堆栈溢出是由于在此处调用同一节点上的height()
方法:
else if(left != null && right == null || left == null && right != null) return height()+ 1;
else return height()+ 2;
我只想把它扔进去。如果你想要一个节点,从高度0
开始显然保持
if(left == null && right == null) return 0;