Java 二叉搜索树
嗨 我有一个数组列表,里面有一些数字,比如Java 二叉搜索树,java,binary-tree,binary-search,Java,Binary Tree,Binary Search,嗨 我有一个数组列表,里面有一些数字,比如{23,16,45,26,2,5,9} 我想用这个数组列表做一个二叉搜索树,它是“array”,它的元素是有2个fields,1)digit2)level的对象,但这里我只想使用它的digit字段。另外dList是一个双链接列表。 这是我的代码,但会引发异常。请帮助我,谢谢 private void method(ArrayList<Element> array) { DNode header = new DNode(null
{23,16,45,26,2,5,9}
我想用这个数组列表做一个二叉搜索树,它是“array”
,它的元素是有2个fields,1)digit2)level
的对象,但这里我只想使用它的digit
字段。另外dList
是一个双链接列表。
这是我的代码,但会引发异常。请帮助我,谢谢
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);
}
第一行例外情况适用于这一行代码:
if (!e.equals(node.getElement()))
您的递归方法“private void makeBST(DNode节点,Element e)”需要某种类型的结束条件(流路径将阻止它自己调用);实际上,它一直在递归地调用自己,这就是导致堆栈溢出错误的原因。您的递归方法“private void makeBST(DNode节点,Element e)”需要某种类型的结束条件(流路径将阻止它调用自身);事实上,它一直递归地调用自己,这就是导致堆栈溢出错误的原因。您得到了一个StackOverflowerError,它指向一个无限(嗯,至少可能是)递归错误
p、 为什么不使用a,其中K是数据的索引,V是数据值?您得到了一个StackOverflowerError,它指向一个无限(很好,可能至少)递归错误
p、 为什么不使用a,其中K是数据的索引,V是数据值?您的代码基本上是:
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,而是使用递归)。因为堆栈大小非常有限,经过一些迭代之后,您会得到StackOverflowerError
但无论如何,如果这只是一个教育实验,那也没关系。如果您只需要一个工作的BST,请使用java.util.TreeSet或java.util.TreeMap。您的代码基本上是:
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,而是使用递归)。因为堆栈大小非常有限,经过一些迭代之后,您会得到StackOverflowerError
但无论如何,如果这只是一个教育实验,那也没关系。如果您只需要一个工作的BST,请使用java.util.TreeSet或java.util.TreeMap。我可以看出您正在尝试,但距离解决方案还有很长的路要走
您正在使用递归,因此需要一个停止案例。。。你没有
如果。。。否则如果。。。而不是你所拥有的(如果…如果…)
如果(!e.equals(node.getElement()){
也没有意义
查看维基百科关于二叉树和二叉搜索树的文章……可能会有所帮助。我可以看出您正在尝试,但您离解决方案还有很长的路要走
你在使用递归,所以你需要一个停止案例…你没有
你也应该有if…else if…而不是你所拥有的(if…if…)
如果(!e.equals(node.getElement()){
也没有意义
查看维基百科中关于二叉树和二叉搜索树的文章……可能会有所帮助。我如何完成其递归调用?我认为您需要在第一个if块的末尾使用“return”。或者,在相同的结果下,您可以将递归makeBST调用放入适当的“else if”块。@user472221、TToni和iirekm都正确。对于递归结束条件,您需要考虑何时需要停止递归(提示:当您有一个大小为0或1的树时会发生什么情况?)-当达到该条件时,您需要确保函数停止调用自身。是的,您现在没有抛出此异常。谢谢!我如何完成其递归调用?我认为您需要在第一个if块的末尾使用“return”。或者,在相同的结果下,您可以将递归makeBST调用放入适当的“else if”块。@user472221、TToni和iirekm都正确。对于递归结束条件,您需要考虑何时需要停止递归(提示:当您有一个大小为0或1的树时会发生什么情况?)-当达到该条件时,您需要确保函数停止调用自身。是的,您现在正在执行,它不会引发此异常。谢谢!我如何使用treeSet或treeMap创建BST?您能帮我吗?我如何使用treeSet或treeMap创建BST?您能帮我吗?