左式堆

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;
			}
		}
	}
}

以上是关于左式堆的主要内容,如果未能解决你的问题,请参考以下文章

左式堆

左式堆的实现与详解

转载:数据结构 左式堆

堆之左式堆和斜堆

左式堆的合并

左式堆