树-下(哈夫曼树)

哈夫曼树

  • 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值W(k),从根结点到每个叶子结点的长度为l(k),则每个叶子结点的带权路径长度之和就是
  • 最优二叉树或哈夫曼树:WPL最小的二叉树
  • 特点
  1. 没有度为1的结点
  2. n个叶子结点的哈夫曼树共有2n-1个结点
  3. 哈夫曼树的任意非叶节点的左子树交换后仍是哈夫曼树

哈夫曼树的构造

typedef struct TreeNode *HuffmanTree
struct TreeNode {
      int Weight;
      HuffmanTree Left, Right;
}
HufmanTree Huffman (MinHeap H) {
      //假设H->Size个权值已经存在H->Elements[]->Weight里
      int i;
      HuffmanTree T;
      BulidMinHeap(H);     //将H->Elements[]按权值调整为最小堆
      for (i = 1; i < H->Size; i++) { //做H->Size-1次合并
            T = malloc(sizeof(struct TreeNode)) ; //建立新的结点
            T->Left = DeleteMin(H);       //从最小堆中删除一个结点,作为新T的左子结点
            T->Right = DeleteMin(H);      //从最小堆中删除一个结点,作为新T的右子结点
            T->Weight = T->Left->Weight+T->Right->Weight;  //计算新权值
            Insert(H, T);                 //将新T插入最小堆
      }
      T = DeleteMin(H);
      return T;
posted @ 2020-08-15 21:44  小哑师兄  阅读(144)  评论(0编辑  收藏  举报