【数据结构第四周】树知识点整理(下)【堆】

队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。

1、堆的两个特性

结构性:用数组表示的完全二叉树

有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)

最大堆(MaxHeap)”,也称“大顶堆”:最大值 

最小堆(MinHeap)”,也称“小顶堆” :最小值 

2、

1
2
3
4
5
6
typedef struct HeapStruct *MaxHeap;
struct HeapStruct {
    ElementType *Elements; /* 存储堆元素的数组 */
    int Size;/*堆的当前元素个数*/
    int Capacity;/*堆的最大容量*/
};

 

1
2
3
4
5
6
7
8
9
10
MaxHeap Create( int MaxSize )
{
    MaxHeap H = malloc( sizeof( struct HeapStruct ) );/* 创建容量为MaxSize的空的最大堆 */
    H->Elements = malloc( (MaxSize+1) * sizeof(ElementType));
    H->Size = 0;
    H->Capacity = MaxSize;
    H->Elements[0] = MaxData;
    /* 定义“哨兵”为大于堆中所有可能元素的值,便于以后更快操作 */
    return H;
}

3、将新增结点插入到从其父结点到根结点的有序序列中 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 将元素item 插入最大堆H,其中H->Elements[0]已经定义为哨兵 */
void Insert( MaxHeap H, ElementType item )
{
    int i;
    if ( IsFull(H) ) {
        printf("最大堆已满");
        return;
    }
    i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */
    for ( ; H->Elements[i/2] < item; i/=2 )
    {
        H->Elements[i] = H->Elements[i/2]; /* 向下过滤结点 */
    }
     
    H->Elements[i] = item; /* 将item 插入 */
}

4、删除最大堆中的最大值元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* 从最大堆H中取出键值为最大的元素,并删除一个结点 */
ElementType DeleteMax( MaxHeap H )
{
    int Parent, Child;
    ElementType MaxItem, temp;
    if ( IsEmpty(H) ) {
        printf("最大堆已为空");
        return;
    }
    MaxItem = H->Elements[1]; /* 取出根结点最大值 */
    /* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */
    temp = H->Elements[H->Size--];
    for( Parent=1; Parent*2<=H->Size; Parent=Child ) {
        Child = Parent * 2;
        if( (Child!= H->Size) && (H->Elements[Child] < H->Elements[Child+1]) )
        {
            Child++; /* Child指向左右子结点的较大者 */
        }
        if( temp >= H->Elements[Child] ) break;
        else /* 移动temp元素到下一层 */
        H->Elements[Parent] = H->Elements[Child];
    }
    H->Elements[Parent] = temp;
    return MaxItem;
}

 

 

 

posted @   Summer先生  阅读(458)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示