堆 C++ 代码


堆 C++ 代码

// File name: HeapTree.h
// Author: Arman Sahakyan
// Copyright (C) 2007, The CodeProject
// Contact: arman_sahakyan@edu.aua.am
#pragma once

class CHeapTree
{
    int m_nSize;
    int m_nMAX;
    const int m_nInitMax;
    struct _NODE {
        TID id;
        TDATA data;
    };
    _NODE *m_data;
public:
    CHeapTree(int nInitMax = 100);
    ~CHeapTree();
    bool IsEmpty() const { return m_nSize == 0; }
    int GetSize() const { return m_nSize; }
    void Insert(const TID &id, const TDATA &data);
    // Remove the element with the highest priority [if the heap is not empty]
    bool RemoveTop();
    bool RemoveAll();
    bool GetTopID(TID *pid) const {
        if (IsEmpty()) return false;
        *pid = m_data[0].id;
        return true;
    }
    bool GetTopData(TDATA *pdata) const {
        if (IsEmpty()) return false;
        *pdata = m_data[0].data;
        return true;
    }
    bool GetData(const TID &id, TDATA *pdata) const;
    // Change the data of a node with TID = id and reformat the heap
    bool ResetData(const TID &id, const TDATA &data);
private:
    // Reconstructs the heap be starting the element with index = iRoot
    void _ReformatHeap(int iRoot);
};


{
    m_nMAX = m_nInitMax;
    m_data = new _NODE[m_nMAX];
    m_nSize = 0;
}


{
    delete [] m_data;
}


{
    if (m_nSize == m_nMAX - 1)
    { // Resize the m_data array by doubling its size.
        m_nMAX += m_nMAX;
        _NODE *pTemp = m_data;
        m_data = new _NODE[m_nMAX];

            m_data[j] = pTemp[j];
        delete [] pTemp;
    }
    _NODE node = { id, data };
    m_data[m_nSize] = node;
    int iCur = m_nSize ++;
    int iParent = (iCur - 1) / 2;
    while (iParent >= 0 && m_data[iParent].data > m_data[iCur].data) {
        _NODE t = m_data[iCur];
        m_data[iCur] = m_data[iParent];
        m_data[iParent] = t;
        iCur = iParent;
        iParent = (iCur - 1) / 2;
    }
}


{
    if (IsEmpty()) return false;
    if (m_nSize == m_nMAX / 2)
    { // Resize the m_data array by shrinking its size twice.
        m_nMAX /= 2;
        _NODE *pTemp = m_data;
        m_data = new _NODE[m_nMAX];

            m_data[j] = pTemp[j];
        delete [] pTemp;
    }
    m_data[0] = m_data[-- m_nSize]; // move the last elem to the first place
    _ReformatHeap(0);
    return true;
}


{
    if (IsEmpty()) return false;
    delete [] m_data;
    m_nMAX = m_nInitMax;
    m_data = new _NODE[m_nMAX];
    m_nSize = 0;
    return true;
}


{

        if (m_data[j].id == id) {

                m_data[j].data = dataNew;
                _ReformatHeap(0);
            }
            else {
                m_data[j].data = dataNew;
                _NODE node = m_data[j];
                int iCur = j;
                int iParent = (iCur - 1) / 2;
                while (iParent >= 0 && m_data[iParent].data > m_data[iCur].data) {
                    _NODE t = m_data[iCur];
                    m_data[iCur] = m_data[iParent];
                    m_data[iParent] = t;
                    iCur = iParent;
                    iParent = (iCur - 1) / 2;
                }
            }
            return true;
        }
        return false; // id not found
}


{

        if (m_data[j].id == id) {
            *pdata = m_data[j].data;
            return true;
        }
    return false; // not found
}


{
    int iChild = 2 * iRoot + 1; // left child index

    {
        int iRightChild = iChild + 1; // right child index

        {
            if (m_data[iChild].data > m_data[iRightChild].data)
                iChild = iRightChild;
        }

            _NODE t = m_data[iRoot];
            m_data[iRoot] = m_data[iChild];
            m_data[iChild] = t;
            _ReformatHeap(iChild);
        }
    }
}

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《堆 C++ 代码
本文地址:https://www.zhiletu.com/archives-7833.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微