1. 程式人生 > >哈夫曼樹(一)之 C語言詳解

哈夫曼樹(一)之 C語言詳解

/*
 * 建立Huffman樹
 *
 * 引數說明:
 *     a 權值陣列
 *     size 陣列大小
 *
 * 返回值:
 *     Huffman樹的根
 */
HuffmanNode* create_huffman(Type a[], int size)
{
    int i;
    HuffmanNode *left, *right, *parent;

    // 建立陣列a對應的最小堆
    create_minheap(a, size);

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

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


        // 將parent節點資料拷貝到"最小堆"中
        if (dump_to_minheap(parent)!=0)
        {
            printf("插入失敗!\n結束程式\n");
            destroy_huffman(parent);
            parent = NULL;
            break;
        }
    }   

    // 銷燬最小堆
    destroy_minheap();

    return parent;
}