Esempio n. 1
0
  /**
   * Heapify up the treap at the current node to the root.
   *
   * @param current to heapify.
   */
  private void heapify(TreapNode<T> current) {
    // Bubble up the heap, if needed
    TreapNode<T> parent = (TreapNode<T>) current.parent;
    while (parent != null && current.priority > parent.priority) {
      Node<T> grandParent = parent.parent;
      if (grandParent != null) {
        if (grandParent.greater != null && grandParent.greater.equals(parent)) {
          // My parent is my grandparents greater branch
          grandParent.greater = current;
          current.parent = grandParent;
        } else if (grandParent.lesser != null && grandParent.lesser.equals(parent)) {
          // My parent is my grandparents lesser branch
          grandParent.lesser = current;
          current.parent = grandParent;
        } else {
          System.err.println(
              "YIKES! Grandparent should have at least one non-NULL child which should be my parent.");
        }
        current.parent = grandParent;
      } else {
        root = current;
        root.parent = null;
      }

      if (parent.lesser != null && parent.lesser.equals(current)) {
        // LEFT
        parent.lesser = null;

        if (current.greater == null) {
          current.greater = parent;
          parent.parent = current;
        } else {
          Node<T> lost = current.greater;
          current.greater = parent;
          parent.parent = current;

          parent.lesser = lost;
          lost.parent = parent;
        }
      } else if (parent.greater != null && parent.greater.equals(current)) {
        // RIGHT
        parent.greater = null;

        if (current.lesser == null) {
          current.lesser = parent;
          parent.parent = current;
        } else {
          Node<T> lost = current.lesser;
          current.lesser = parent;
          parent.parent = current;

          parent.greater = lost;
          lost.parent = parent;
        }
      } else {
        // We really shouldn't get here
        System.err.println(
            "YIKES! Parent should have at least one non-NULL child which should be me.");
      }

      parent = (TreapNode<T>) current.parent;
    }
  }