左式堆

来源:互联网 发布:数据机房空调设计 编辑:程序博客网 时间:2024/06/06 02:40
package com.iflytek.heap;/** * 左式堆 * @author fgtian * */public class LeftListHeap {public static class HeapNode {int mValue;int mNpl = 0;HeapNode mLeftChild;HeapNode mRightChild;}HeapNode mRoot = null;public void insert(int value) {HeapNode node = new HeapNode();node.mValue = value;merge(node);}public int delMin() {if (null == mRoot) {throw new NullPointerException("null == mRoot");}int value = mRoot.mValue;mRoot = merge(mRoot.mLeftChild, mRoot.mRightChild);return value;}public void merge(HeapNode node) {mRoot = merge(mRoot, node);if (npl(mRoot.mRightChild) > npl(mRoot.mLeftChild)) {HeapNode l = mRoot.mLeftChild;mRoot.mLeftChild = mRoot.mRightChild;mRoot.mRightChild = l;}mRoot.mNpl = Math.min(npl(mRoot.mLeftChild), npl(mRoot.mRightChild)) + 1;}public void merge(LeftListHeap heap) {merge(heap.mRoot);}public static int npl(HeapNode h) {if (null == h) {return -1;}return h.mNpl;}public static HeapNode merge(HeapNode h1, HeapNode h2) {if (null == h1) {return h2;} else if (h2 == null) {return h1;} else { // 两个都不是nullint v1 = h1.mValue;int v2 = h2.mValue;if (v1 <= v2) { // 拿他的h1.mRightChild = merge(h1.mRightChild, h2);if (npl(h1.mLeftChild) < npl(h1.mRightChild)) {HeapNode node = h1.mLeftChild;h1.mLeftChild = h1.mRightChild;h1.mRightChild = node;}h1.mNpl = Math.min(npl(h1.mLeftChild), npl(h1.mRightChild)) + 1;return h1;} else {h2.mRightChild = merge(h1, h2.mRightChild);if (npl(h2.mLeftChild) < npl(h2.mRightChild)) {HeapNode node = h2.mLeftChild;h2.mLeftChild = h2.mRightChild;h2.mRightChild = node;}h2.mNpl = Math.min(npl(h2.mLeftChild), npl(h2.mRightChild)) + 1;return h2;}}}}

2 1
原创粉丝点击