二叉堆

二叉堆是一种特殊的堆,是完全二叉树。二叉堆有两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。
例如下图的最小堆

二叉堆_第1张图片

二叉堆一般用数组来表示。如果根节点在数组中的位置是1,第n个位置的子节点分别在2n和 2n+1。因此,第1个位置的子节点在2和3,第2个位置的子节点在4和5。以此类推。这种基于1的数组存储方式便于寻找父节点和子节点

在二叉堆上可以进行插入节点、删除节点、取出值最小的节点、减小节点的值等基本操作

插入:先把插入的元素放到底部,然后和其上的子树中的根、子结点进行交换,来移动它的位置,直到某一个位置使得原来的二叉树符合二叉堆的定义。

int d[N];
int size;
void sca(int x)
{
    d[++size]=x;
    n=size;
    while(now)
        {
         m=n/2;
        if(d[m]>d[n])
        {
         int t=d[m]
         d[m]=d[n]
         d[n]=t;
         }
        else
         break;
        n=m;//重置继续下一轮
    }
    return; 
}

删除
先将此节点移除,然后将最后一个节点暂时安放在删除节点的位置;开始向下比较左右子节点的大小,如果是比两个子节点都小,那么终止下沉操作,生成新的二叉堆,如果是比其中任何一个子节点大,那么就将此节点和其子节点中最小的那个互换位置,依次循环,直到没有子节点或者比子节点小,终止下沉操作,生成最终的新二叉堆。

void dele(int now)
{
    int t=d[n];
    d[n]=d[size];
    d[size]=t;
    size--;
    while((n*2)<=size)
    {
        int m=n*2;
        if(m+1<=size&&d[m+1]<d[m])
            m++;
        if(d[m]<d[n])
        {
            t=d[m];
            d[m]=d[n];
            d[n]=t;
        }
        else
            break;
        n=m;
    }
}

你可能感兴趣的:(二叉堆)