Ejemplo 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;
    }
  }
Ejemplo n.º 2
0
  /**
   * Splay the tree at the node.
   *
   * @param node to splay at.
   */
  private void splay(Node<T> node) {
    Node<T> parent = node.parent;
    Node<T> grandParent = (parent != null) ? parent.parent : null;
    if (parent == root) {
      // Zig step
      root = node;
      node.parent = null;

      if (parent != null) {
        if (node == parent.lesser) {
          parent.lesser = node.greater;
          if (node.greater != null) node.greater.parent = parent;

          node.greater = parent;
          parent.parent = node;
        } else {
          parent.greater = node.lesser;
          if (node.lesser != null) node.lesser.parent = parent;

          node.lesser = parent;
          parent.parent = node;
        }
      }
    } else if (parent != null && grandParent != null) {
      Node<T> greatGrandParent = grandParent.parent;
      if (greatGrandParent != null && greatGrandParent.lesser == grandParent) {
        greatGrandParent.lesser = node;
        node.parent = greatGrandParent;
      } else if (greatGrandParent != null && greatGrandParent.greater == grandParent) {
        greatGrandParent.greater = node;
        node.parent = greatGrandParent;
      } else {
        // I am now root!
        root = node;
        node.parent = null;
      }

      if ((node == parent.lesser && parent == grandParent.lesser)
          || (node == parent.greater && parent == grandParent.greater)) {
        // Zig-zig step
        if (node == parent.lesser) {
          Node<T> nodeGreater = node.greater;
          node.greater = parent;
          parent.parent = node;

          parent.lesser = nodeGreater;
          if (nodeGreater != null) nodeGreater.parent = parent;

          Node<T> parentGreater = parent.greater;
          parent.greater = grandParent;
          grandParent.parent = parent;

          grandParent.lesser = parentGreater;
          if (parentGreater != null) parentGreater.parent = grandParent;
        } else {
          Node<T> nodeLesser = node.lesser;
          node.lesser = parent;
          parent.parent = node;

          parent.greater = nodeLesser;
          if (nodeLesser != null) nodeLesser.parent = parent;

          Node<T> parentLesser = parent.lesser;
          parent.lesser = grandParent;
          grandParent.parent = parent;

          grandParent.greater = parentLesser;
          if (parentLesser != null) parentLesser.parent = grandParent;
        }
      } else {
        // Zig-zag step
        if (node == parent.lesser) {
          Node<T> nodeLesser = node.greater;
          Node<T> nodeGreater = node.lesser;

          node.greater = parent;
          parent.parent = node;

          node.lesser = grandParent;
          grandParent.parent = node;

          parent.lesser = nodeLesser;
          if (nodeLesser != null) nodeLesser.parent = parent;

          grandParent.greater = nodeGreater;
          if (nodeGreater != null) nodeGreater.parent = grandParent;
        } else {
          Node<T> nodeLesser = node.lesser;
          Node<T> nodeGreater = node.greater;

          node.lesser = parent;
          parent.parent = node;

          node.greater = grandParent;
          grandParent.parent = node;

          parent.greater = nodeLesser;
          if (nodeLesser != null) nodeLesser.parent = parent;

          grandParent.lesser = nodeGreater;
          if (nodeGreater != null) nodeGreater.parent = grandParent;
        }
      }
    }
  }