左式堆实现
Posted 竹马今安在
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左式堆实现相关的知识,希望对你有一定的参考价值。
左式堆是为了方便合并操作实现的。
左式堆性质:
任意节点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; } }
以上是关于左式堆实现的主要内容,如果未能解决你的问题,请参考以下文章