您的位置:首页 > 编程语言 > C#

C# 二叉堆

2016-02-02 14:52 381 查看
二叉堆数据结构讲解: http://www.cnblogs.com/yc_sunniwell/archive/2010/06/28/1766751.html

 

C#代码实现

using System;
using System.Collections.Generic;

namespace 二叉堆
{
//从小到大
public class BinaryHeap
{
private int[] heap;
private int index = 1;

public void Init(int count)
{
count++;
heap = new int[count];

}

public void Enqueue(int value)
{
heap[index] = value;

if (index == 1) {
index++;
return;
}

//开始从最下层跟父节点对比,往上升级
int temp = 0;
int tempIndex = index;
int parentIndex = 0;
int tempI = tempIndex % 2 == 0 ? 0 : 1;

//动态改变tempI=0?1,进入左右与父节点的值比较和交换
while (heap[tempIndex] < heap[(parentIndex = (tempIndex - tempI) / 2)])
{
temp = heap[tempIndex];
heap[tempIndex] = heap[parentIndex];
heap[parentIndex] = temp;
tempIndex = parentIndex;

tempI = tempIndex % 2 == 0 ? 0 : 1;     //判断我现在是左节点(i * 2),还是右节点(i - 1 * 2)
}

index++;
}

public int Dequeue()
{
if (index == 1)
return heap[index];

int result = heap[1];
heap[1] = 0;

int temp = 0;
int tempIndex = 1;
int indexLeft = 0;
int indexRight  = 0;

//当堆里面有两个元素的时候,也就是index>=2的时候
while(tempIndex * 2 < index)
{
indexLeft = (tempIndex * 2 < index) ? tempIndex * 2 : 0;
indexRight = ((tempIndex) * 2 + 1 < index) ? (tempIndex) * 2 + 1 : 0;

//两个节点都存在情况下
if(Convert.ToBoolean(indexLeft) && Convert.ToBoolean(indexRight))
{
if (heap[indexLeft] < heap[indexRight])
{
temp = heap[tempIndex];
heap[tempIndex] = heap[indexLeft];
heap[indexLeft] = temp;

tempIndex = indexLeft;
}
else
{
temp = heap[tempIndex];
heap[tempIndex] = heap[indexRight];
heap[indexRight] = temp;

tempIndex = indexRight;
}
}
else if (Convert.ToBoolean(indexLeft))
{

temp = heap[tempIndex];
heap[tempIndex] = heap[indexLeft];
heap[indexLeft] = temp;

tempIndex = indexLeft;
}
else
{
break;
}
}

if(tempIndex != index - 1)
{
heap[tempIndex] = heap[index - 1];
heap[index - 1] = 0;

int tempI = tempIndex % 2 == 0 ? 0 : 1;
int parentIndex = 0;

//动态改变tempI=0?1,进入左右与父节点的值比较和交换
while (heap[tempIndex] < heap[(parentIndex = (tempIndex - tempI) / 2)])
{
temp = heap[tempIndex];
heap[tempIndex] = heap[parentIndex];
heap[parentIndex] = temp;
tempIndex = parentIndex;

tempI = tempIndex % 2 == 0 ? 0 : 1;     //判断我现在是左节点(i * 2),还是右节点(i - 1 * 2)
}
}

index--;
return result;
}

public int GetMin()
{
if (index == 1)
return 0;

return heap[1];
}

public override string ToString()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb = sb.Append("0-");
for (int i = 1; i < heap.Length; i++)
{
if (heap[i] == 0)
break;
sb = sb.Append(heap[i] + "-");
}

sb = sb.Remove(sb.Length - 1, 1);

return sb.ToString();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: