Esempio n. 1
0
 public TreapDelete(Treap T, int x) {
   super(T);
   this.T = T;
   T.setV(v = new TreapNode(T, K = x));
   v.setColor(NodeColor.DELETE);
   setHeader("deletion");
 }
Esempio n. 2
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;
    }
  }
Esempio n. 3
0
  @Override
  public void run() {
    if (T.getRoot() == null) {
      v.goToRoot();
      addStep("empty");
      mysuspend();
      v.goDown();
      v.setColor(NodeColor.NOTFOUND);
      addStep("notfound");
      return;
    } else {
      TreapNode d = (TreapNode) T.getRoot();
      v.goTo(d);
      addStep("bstdeletestart");
      mysuspend();

      while (true) {
        if (d.key == K) { // found
          v.setColor(NodeColor.FOUND);
          break;
        } else if (d.key < K) { // right
          addStep("bstfindright", K, d.key);
          d = d.getRight();
          if (d != null) {
            v.goTo(d);
          } else {
            v.goRight();
            break;
          }
        } else { // left
          addStep("bstfindleft", K, d.key);
          d = d.getLeft();
          if (d != null) {
            v.goTo(d);
          } else {
            v.goLeft();
            break;
          }
        }
        mysuspend();
      }

      if (d == null) { // notfound
        addStep("notfound");
        return;
      }

      d.setColor(NodeColor.FOUND);
      T.setV(null);
      addStep("treapbubbledown");
      // prebubleme k listu
      while (!d.isLeaf()) {
        if (d.getLeft() == null) {
          T.rotate(d.getRight());
        } else if (d.getRight() == null) {
          T.rotate(d.getLeft());
        } else if (d.getRight().p > d.getLeft().p) {
          T.rotate(d.getRight());
        } else {
          T.rotate(d.getLeft());
        }
        mysuspend();
      }
      T.setV(d);
      addStep("treapdeletecase1");
      mysuspend();
      if (d.isRoot()) {
        T.setRoot(null);
      } else if (d.isLeft()) {
        d.getParent().setLeft(null);
      } else {
        d.getParent().setRight(null);
      }
      d.goDown();

      T.reposition();
      addStep("done");
    }
  }