JAVA实现二叉树带权路径长度和_哈夫曼树的构建与最小带权路径长度

注意:哈夫曼树并不唯一,但带权路径长度一定是相同的。

二叉树:每个结点最多含有两个子树的树称为二叉树。

定理:对于具有n个叶子结点的哈夫曼树,共有2n-1个结点。

5395467aceeec57127165592f86f2800.png

哈夫曼树介绍

1哈夫曼树的定义

哈夫曼(Huffman)树,又称最优二叉树,是由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树。给定n个数值{ W1,W2,…,Wn},若将它们作为n个结点的权,并以这n个结点为叶子结点构造一颗二叉树,那么就可以构造出多棵具有不同形态的二叉树,其中带权路径长度最短的那棵二叉树称为哈夫曼树,或称最优二叉树。如图(二)所示:

dfe826fafb4496af3ce6342cede7091f.png

WPL:树中从根到所有叶子结点的各个带权路径长度之和

2 构建哈夫曼树的方法

如下:

(1)初始化:根据给定的n个权值{W1,W2,….,Wn}构造n棵二叉树的森林T{T1,T2,…Tn},其中每棵二叉树Ti (1≤i≤n)中都只有一个带权Wi为的根结点,其左、右子树均为空。

(2)找最小树:在森林T中选取两棵结点权值最小的子树分别作为左、右子树构造一棵新的二叉树、且使左子树的权值小于右子树的权值、且置新的二叉树的根结点的权值为其左、右子树上根结点权值之和。

(3)删除与加入:在森林T中,删除这二棵树,同时将新得到的二叉树加入T中。

(4)判断:重复(2)与(3)操作,直到T只含一棵二叉树树为止,这棵树便是哈夫曼树。如图(三)所示:

6d53f23b05be2daf1b162360448e99e1.png

因为权值的不同,哈夫曼树的样子有点不同,为了加深对哈夫曼树构建过程的认识,笔者再列举一个哈夫曼树的构建,见图(四):

80e86f7f0782c605c36a7387685038ed.png

(1)8个结点的权值大小如下:

415644fa9e5523091b40dc73c43ad87f.png

(2)从19,21,2,3,6,7,10,32中选择两个权小结点。选中2,3。同时算出这两个结点的和5。

337171faaeb84ef7f7318cbdea0609c2.png

(3)从19,21,6,7,10,32,5中选出两个权小结点。选中5,6。同时计算出它们的和11。

716d835feee311509c8619f7930dfd26.png

(4)从19,21,7,10,32,11中选出两个权小结点。选中7,10。同时计算出它们的和17。

(注:如果两个数的和正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了,如果这两个数的和比较大,不是下一步的两个最小数的其中一个,那么就并列生长。)比如比较最小两个   7 10 11  所以只能另起一个

d55d7b0d5ab318f1794787771c652afd.png

(5)从19,21,32,11,17中选出两个权小结点。选中11,17。同时计算出它们的和28。

43756df494ec7b9a9b430e3ab019ac80.png

(6)从19,21,32,28中选出两个权小结点。选中19,21。同时计算出它们的和40。另起一颗二叉树。

b22182c64f2be6f919d033b39926b793.png

(7)从32,28, 40中选出两个权小结点。选中28,32。同时计算出它们的和60。

3df59858c90b2681304954f5c5aa80a1.png

(8)从 40, 60中选出两个权小结点。选中40,60。同时计算出它们的和100。 好了,此时哈夫曼树已经构建好了。

42ab072462e40871e469027a62f44978.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值