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