左式堆实现
左式堆是为了方便合并操作实现的。
左式堆性质:
任意节点X的零路径长是X到任意没有两个儿子的节点的最短路径。任意一个节点的零路径长比他儿子的零路径长的最大值大1,null的零路径长是-1;对于x来说,他的左儿子的零路径长要大于等于右儿子。
通过递归实现代码如下
public class LeftistHeap<T extends Comparable<? super T>>{ private Node<T> root; public LeftistHeap(){ this.root=null; } public void merge(LeftistHeap<T> rhs){ if(this.root==rhs.root){ return; } merge(this.root, rhs.root); rhs.root=null; } private Node<T> merge(Node<T> t1,Node<T> t2){ if(t1==null){ return t2; } if(t2==null){ return t1; } if(t1.val.compareTo(t2.val)<0){ return merge1(t1, t2); } else{ return merge1(t2, t1); } } private Node<T> merge1(Node<T> t1,Node<T> t2){ if(t1.left==null){ t1.left=t2; }else{ t1.right=merge(t1.right, t2); if(t1.left.npl<t1.right.npl){ swapChildren(t1); } t1.npl=t1.right.npl+1; } return t1; } public void insert(T val){ merge(new Node(val),root); } public T findMin(){ return root.val; } public T deleteMin(){ T val=root.val; root=merge(root.left,root.right); return val; } public boolean isEmpty(){ return root==null; } public void makeEmpty(){ root=null; } private void swapChildren(Node<T> t){ Node<T> left=t.left; Node<T> right=t.right; t.left=right; t.right=left; } }