刚刚结束了京东的笔试,发现很多知识点都不太了解,所以在这篇文章做一个汇总学习。
目录
1 哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
参考百度百科
题目考察的要点是如何计算哈夫曼树的带权路径长度。
(参考文章:https://blog.csdn.net/u013011841/article/details/38226099)
1)路径长度:一个结点到另一个结点的分支数目。如下图所示(根节点到D之间的路径长度为4):
2)树的路径长度:根节点到每一个结点的路径长度之和。如下图所示(树的路径长度为1+2+3+4+1+2+3+4 = 20):
3)带权路径长度:上图所示的例子中,带权路径的长度为5*1+15*2+40*3+30*4+10*4=315
4)哈夫曼树:带权路径长度最小的二叉树。
5)构造哈夫曼树
1、根据给定的n个权值{w[1],w[2],…,w[n]}构成n棵二叉树的集合F={T[1],T[2],…T[n]},其中每棵二叉树T[i];中只有一个带权为w[i]的根结点,其左右子树均为空。
2、在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
3、在F中删除这两棵树,同时将新得到的二义树加入F中。
4重复2和3步骤,直到F只含一棵树为止。这棵树便是哈夫曼树。
用画图表示上面的步骤: