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"); }
/** * 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; } }
@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"); } }