1. 程式人生 > >哈夫曼樹(二)之 C++詳解

哈夫曼樹(二)之 C++詳解

/* 
 * 建立Huffman樹
 *
 * 引數說明:
 *     a 權值陣列
 *     size 陣列大小
 *
 * 返回值:
 *     Huffman樹的根節點
 */
template <class T>
void Huffman<T>::create(T a[], int size)
{
    int i;
    HuffmanNode<T> *left, *right, *parent;
    MinHeap<T> *heap = new MinHeap<T>();

    // 建立陣列a對應的最小堆
    heap->create(a, size);

    for(i=0; i<size-1; i++)
    {   
        left = heap->dumpFromMinimum();  // 最小節點是左孩子
        right = heap->dumpFromMinimum(); // 其次才是右孩子

        // 新建parent節點,左右孩子分別是left/right;
        // parent的大小是左右孩子之和
        parent = new HuffmanNode<T>(left->key+right->key, left, right, NULL);
        left->parent = parent;
        right->parent = parent;


        // 將parent節點資料拷貝到"最小堆"中
        if (heap->copyOf(parent)!=0)
        {
            cout << "插入失敗!" << endl << "結束程式" << endl;
            destroy(parent);
            parent = NULL;
            break;
        }
    }

    mRoot = parent;

    // 銷燬最小堆
    heap->destroy();
    delete heap;
}