问:什么是最小堆?什么是最大堆?在堆中怎么插入或删除一个元素?

答:

最大堆和最小堆是二叉堆的两种形式。

最大堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。

最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。

            

            

最大堆的插入

最大堆的插入的思想就是先在最后的结点添加一个元素,然后沿着树上升。跟最大堆的初始化大致相同。

MaxHeap<T> &Insert(const T&x)  
    {     
        if(CurrentSize == MaxSize)  
            exit(1);        //没有足够空间  
  
        //为x寻找应插入位置  
        //i从新的叶节点开始,并沿着树上升  
        int i = ++ CurrentSize;  
        while(i != 1 && x > heap[i/2])  
        {  
            //不把x放进heap[i]  
            heap[i] = heap[i/2];        //元素下移  
            i /= 2;     //移向父节点  
        }  
        heap[i] = x;        //这时候才把x放进去  
        return *this;  
    }  


最大堆的删除

最大堆的删除,即删除最大的元素。我们先取最后的元素提到根结点,然后删除最大值,然后再把新的根节点放到合适的位置

MaxHeap<T> &DeleteMax(T &x)  
    {  
        //检查堆是否为空  
        if(CurrentSize == 0)  
            exit(1);        //队列空  
  
        x = heap[1];        //最大元素  
        T y = heap[CurrentSize--];      //最后一个元素  
        //从根开始,重构大堆  
        int i = 1, ci = 2;      //ci为i的儿子  
        while(ci < CurrentSize)  
        {  
            if(ci < CurrentSize && heap[ci] < heap[ci + 1])           //比较两个子节点大小,取其大  
                ci ++;  
            //能否放y  
            if(heap[ci] > y)     //不能  
            {  
                heap[i] = heap[ci];     //孩子上移  
                i = ci;                 //下移一层  
                ci *= 2;  
            }  
            else            //能  
                break;  
        }  
        heap[i] = y;  
        return *this;  
    }  

小根堆的插入与删除如上所述同理。

 

猜你喜欢

转载自blog.csdn.net/u014689845/article/details/88256712
今日推荐