左式堆实现

左式堆是为了方便合并操作实现的。

左式堆性质:

任意节点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;
    }
}

 

posted @ 2017-10-03 18:15  竹马今安在  阅读(218)  评论(0编辑  收藏  举报