code: @Override
      @LogarithmicTime
      public AddressableHeap.Handle<K, V> deleteMin() {
          if (size == 0) {
              throw new NoSuchElementException();
          }
          Node oldRoot = root;
  
          // easy special cases
          if (size == 1) {
              root = null;
              size = 0;
              return oldRoot;
          } else if (size == 2) {
              root = root.o_c;
              root.o_c = null;
              root.y_s = null;
              size = 1;
              oldRoot.o_c = null;
              return oldRoot;
          }
  
          // remove last node
          Node lastNodeParent = findParentNode(size);
          Node lastNode = lastNodeParent.o_c;
          if (lastNode.y_s != lastNodeParent) {
              Node tmp = lastNode;
              lastNode = tmp.y_s;
              tmp.y_s = lastNodeParent;
          } else {
              lastNodeParent.o_c = null;
          }
          lastNode.y_s = null;
  
          // decrease size
          size--;
  
          // place it as root
          // (assumes root.o_c exists)
          if (root.o_c.y_s == root) {
              root.o_c.y_s = lastNode;
          } else {
              root.o_c.y_s.y_s = lastNode;
          }
          lastNode.o_c = root.o_c;
          root = lastNode;
  
          // fix priorities
          fixdown(root);
  
          oldRoot.o_c = null;
          return oldRoot;
      }
docs: {@inheritDoc}