Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二叉搜索树_Java_Binary Tree_Binary Search - Fatal编程技术网

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?您能帮我吗?