java - 添加新节点时使用堆栈来存储trap节点。为什么我会收到 EmptyStackException?

标签 java stack treap

我正在用 Java 构建一个 treap 类。下面是我向陷阱添加新节点的函数。过程是:向下遍历到treap的底部(同时将路径中的每个节点添加到本地堆栈)首先只关心BST结构,然后,一旦到达底部,我将通过利用旋转来重新建立堆不变量我构建的堆栈。

听起来应该可以工作,但我不断收到 EmptyStackException。一旦调用私有(private)“reheap”函数,就会发生此异常。

add 函数适用于添加到 Treap 的第一个节点,例如我这样做: testTree.add(4,19); 但是在第二次添加节点时失败,就像我然后调用: testTree.add(2 ,31);

这是完整的错误:

Exception in thread "main" java.util.EmptyStackException
    at java.util.Stack.peek(Unknown Source)
    at classes.Treap.reheap(Treap.java:137)
    at classes.Treap.add(Treap.java:130)
    at classes.Treap.main(Treap.java:220)

130 -- 指add函数底部对reheap的调用 137 -- 指私有(private)reheap函数的while循环 220 -- 指我尝试在 main 中添加新节点。

我尝试更改重新堆函数中的条件,但无济于事。

boolean add(E key, int priority) {
        Stack<Node<E>> stack = new Stack<Node<E>>();
        if(root == null) {
            Node<E> newroot = new Node<E>(key, priority);
            root = newroot;
            stack.push(root);
            return true;
        }else {

            Node<E> current = new Node<E>(root.data, root.priority); //placeholder, used for traversing
            Node<E> added = new Node<E>(key, priority);  //node to be added to the treap
            if(this.find(key) == true){
                return false;
            }else {
                if(current.right == null && current.left == null) {
                    stack.push(current);
                    if(key.compareTo(current.data) < 0)
                        current = current.left;
                    else
                        current = current.right;
                }
                else {
                    while(current.right != null || current.left != null) {
                        if(key.compareTo(current.data) < 0) {
                            stack.push(current);
                            current = current.left;
                        }
                        if(key.compareTo(current.data) > 0) {
                            stack.push(current);
                            current = current.right;
                        }
                    }
                }
                if(key.compareTo(stack.peek().data) < 0)
                    stack.peek().left = added;
                else if(key.compareTo(stack.peek().data) > 0)
                    stack.peek().right = added;
                if(!stack.isEmpty())
                    this.reheap(added, stack);
                return true;
            }
        }
    }

    private boolean reheap(Node<E> added, Stack<Node<E>> stack) {
        while(added.priority > stack.peek().priority && !stack.isEmpty()) {
            if(stack.peek().right == added)
                stack.peek().rotateLeft();
            else
                stack.peek().rotateRight();
            stack.pop();
        }
        return true;
    }

在第二次调用( testTree.add (2 ,31); )之后,我应该得到一个带有结构的陷阱( Node(2, null, Node(4)) )。 <-- 当然这是在重新堆放之后。

最佳答案

在查看堆栈之前,您需要进行空堆栈检查!

while(!stack.isEmpty() && added.priority > stack.peek().priority) {...}

关于java - 添加新节点时使用堆栈来存储trap节点。为什么我会收到 EmptyStackException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882490/

相关文章:

c++ - 如何使用递归反转打印堆栈?

java - 如何使用三个参数将节点插入到 Treap 上

java - 来自 Java 的 Linux 命令行指令

java - 如何将节点附加到 java 中的现有 XML 文件

java - 从 ArrayList 中删除项目

java - Spring security - 创建 403 访问被拒绝的自定义响应

c++ - 编写了一个C++代码以检查表达式是否具有平衡的括号并且我的代码未运行。我被困了一天

c - 实现堆栈和单链表的最佳方式