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