天天看點

斜堆

package com.iflytek.heap;

/**
 * 斜堆
 * @author fgtian
 *
 */
public class SkewHeap {
	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);
		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(SkewHeap 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);
				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);
				HeapNode node = h2.mLeftChild;
				h2.mLeftChild = h2.mRightChild;
				h2.mRightChild = node;
				h2.mNpl = Math.min(npl(h2.mLeftChild), npl(h2.mRightChild)) + 1;
				return h2;
			}
		}
	}
}
      

繼續閱讀