Leftist tree
A leftist tree or leftist heap is a priority queue implemented with a variant of a binary tree. Leftist trees were invented by Clark Allan Crane and uses the heap structure. In contrast to a binary heap, a leftist tree attempts to be very unbalanced. The two children are sorted such that the right path is the shortest path from the root to an external node. When inserting a new node into a tree, a new one-node tree is created and merged into the existing tree. To delete a minimum item, we remove the root and the left and right sub-trees are then melded. Both these operations take O(logn) time. For insertions, this is slower than binary heaps which support insertion in amortized constant time, O(1).
Leftist trees are advantageous because of their ability to merge quickly, compared to binary heaps which take Θ(n). In almost all cases, skew heaps have better performance.
S-value
The s-value of a node is the distance between that node and an external (imaginary) node. In the diagram, external nodes are the gray boxes. Note that these external nodes are not actually part of the tree and just serve as a visual aide. The s-value is calculated by counting the least number of movements one must make to move from a node to an external node. In the diagram, the s-value of the top node, 4, is 2 because two movements are necessary to reach an external node. For the other three nodes, the s-value is 1 because only one movement is necessary. All nodes added to a leftist tree start with an s-value of 1. One may also calculate the s-value of a node by looking at the s-value of its children: S(node) = min(S(node.leftChild), S(node.rightChild)) + 1.
Merging height biased leftist trees
To merge two nodes together, first one must decide whether to create a min or max height biased leftist tree. For a min height biased leftist tree, select the node with the lower value (node x) and set the higher value node (node y) as its right child. If a right child already exists, then merge node y with the sub-tree rooted by the right child of node x and repeat the merging process. After merging node x and node y the s-value of node x must be updated (see above section, s-value). Now check if node x has a left child. If it does not, then move the right child to the left. If it does have a left child, then the child with the highest s-value should go on the left.
Java code for merging a min height biased leftist tree
public Node merge(Node x, Node y) { if(x == null) return y; if(y == null) return x; // if this was a max height biased leftist tree, then the // next line would be: if(x.element < y.element) if(x.element.compareTo(y.element) > 0) { // x.element > y.element Node temp = x; x = y; y = temp; } x.rightChild = merge(x.rightChild, y); if(x.leftChild == null) { // left child doesn't exist, so move right child to the left side x.leftChild = x.rightChild; x.rightChild = null; x.s = 1; } else { // left child does exist, so compare s-values if(x.leftChild.s < x.rightChild.s) { Node temp = x.leftChild; x.leftChild = x.rightChild; x.rightChild = temp; } // since we know the right child has the lower s-value, we can just // add one to its s-value x.s = x.rightChild.s + 1; } return x; }
External links
Leftist Trees at Dr. Sartaj Sahni's website (Department Chair in CISE at University of Florida)