二叉搜索树

时间:2010-12-13 15:31:33

标签: java binary-tree binary-search

您好 我有一个数组列表,里面有一些数字,如{23,16,45,26,2,5,9} 我想用这个数组列表创建一个二元搜索树"array",它的元素是包含2个字段1)digit2)level的对象,但在这里我只想使用它的{{1} }}} field。另外digitdList。 这是我的代码,但它会抛出异常。请帮助我,谢谢。

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)

4 个答案:

答案 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())) { 没有任何意义......

查看关于二叉树和二叉搜索树的维基百科文章......可能会有所帮助。