左式堆
Posted jzdwajue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左式堆相关的知识,希望对你有一定的参考价值。
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 { // 两个都不是null int 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; } } } }
以上是关于左式堆的主要内容,如果未能解决你的问题,请参考以下文章