哈夫曼树(HuffmanTree)

1.基本概念

首先给出定义哈夫曼树所要用到的几个基本概念:

(1)路径(Path):从树中的一个结点到另一个结点之间的分支构成这两个结点间的路径。

(2)路径长度(Path Length):路径上的分支数。

(3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。

(4)结点的权(Weight of Node):在一些应用中,赋予树中结点的一个有实
际意义的数。

(5)结点的带权路径长度(Weight Path Length of Node):从该结点到树的根结点的路径长度与该结点的权的乘积。

(6)树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和,记为

2.哈夫曼树定义

哈夫曼树(Huffman Tree),又叫最优二叉树。在权为w1,w2,…,wn的n个叶子结点的所有二叉树中,是带权路径长度WPL最小的二叉树。

3.哈夫曼树构造

构造过程:

1.根据给定的n个权值{w1,w2,…,wn}构成二叉树集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树为空.

2.在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为左右子树根结点的权值之和.

3.在F中删除这两棵树,同时将新的二叉树加入F中.

4.重复2、3,直到F只含有一棵树为止.(得到哈夫曼树)

图示如下:

哈夫曼树(HuffmanTree)_第1张图片

4.哈夫曼树的实现

public void Create()
{
    int min1;//最小权重值
    int min2;//次小权重值
    int tmp1;//最小节点的索引
    int tmp2;//次小节点的索引

    //输入 n 个叶子结点的权值
    for (int i = 0; i < this.leafNum; ++i)
    {
        data[i].Weight = Console.Read();
    }

    //处理 n 个叶子结点,建立哈夫曼树
    for (int i = 0; i < this.leafNum - 1; ++i)
    {
        min1 = min2 = Int32.MaxValue;
        tmp1 = tmp2 = 0;
        //在全部结点中找权值最小的两个结点
        for (int j = 0; j < this.leafNum + i; ++j)
        {
            if ((data[j].Weight < min1)&& (data[j].Parent == -1))
            {
                min2 = min1;
                tmp2 = tmp1;
                tmp1 = j;
                min1 = data[j].Weight;
            }
            else if ((data[j].Weight < min2) && (data[j].Parent == -1))   
            {
                min2 = data[j].Weight;
                tmp2 = j;
            }
        }

        //构造新节点
        data[tmp1].Parent = this.leafNum + i;
        data[this.leafNum + i].Weight = data[tmp1].Weight + data[tmp2].Weight;
        data[this.leafNum + i].LChild = tmp1;
        data[this.leafNum + i].RChild = tmp2;
    }
}

 

 

你可能感兴趣的:(C#)