添加节点时二进制搜索树抛出错误

时间:2017-04-02 00:05:30

标签: java binary-search-tree

我有这个用Java编写的二叉搜索树。它似乎工作正常。但是,在调用多个add调用时,我收到StackOverFlow错误。我正在学习用Java编写。有人可以告诉我我做错了吗?

d = []
...
d.append(text)

1 个答案:

答案 0 :(得分:0)

堆栈溢出是由于无限递归循环而发生的,这是由left参数被忽略而有利于根节点引起的。

添加节点1时会出现错误,因为根节点3已经有一个左子节点2和右子节点4.因此,该方法执行递归调用以尝试将节点1添加为左或右子节点节点2,但是当它重新进入方法时,它会忽略节点2,并尝试再次将节点1安装在根节点3下,并且这种情况一直在继续。

public Node<E> addNode(Node<E> left, E e) {
    //lets start with root
    // if (root == null)
    //     createRoot(e, null, null);
    // Node<E> focusNode = root;        // <-- wrong
    Node<E> focusNode = left;           // <-- correct

    //Node<E> newLeft
    Node<E> newNode = new Node<E>(e);

    //while(true)
    if (e.compareTo(focusNode.e) < 0) {
        if (focusNode.getLeft() == null) {
            focusNode.setLeft(newNode);
            size++;
        } else {
            focusNode = focusNode.getLeft();
            addNode(focusNode,e);       // <-- uncomment this line
        }

    } else if (e.compareTo(focusNode.e) >= 0) {
        if (focusNode.getRight() == null) {
            focusNode.setRight(newNode);
            size++;
        } else {
            focusNode = focusNode.getRight();
            addNode(focusNode,e);       // <-- uncomment this line
        }
    }
    return focusNode;
}