前言
关于WPL,树的路径长度,哈夫曼树的介绍,请看:http://www.cnblogs.com/Braveliu/p/3453900.html。
一般树的WPL
进行一次遍历,在叶节点出进行计算。进行遍历时,需要记录所遍历节点的高度,则WPL = WPL + T->weight * high。遍历可采用先,中,后序遍历。
// WPL
// WPL为全局变量,high设为局部变量即可
// 先序遍历后即可得WPL
void Preorder(Node *T, int high)
{
if(T->lchild == NULL && T->rchild == NULL)
{
WPL += T->data * high;
printf("Node:%d high=%d WPL=%d\n", T->data, high, WPL);
}
if(T->lchild != NULL)
{
Preorder(T->lchild, high+1);
}
if(T->rchild != NULL)
{
Preorder(T->rchild, high+1);
}
}
哈夫曼树的WPL
没有必要先建立一颗哈夫曼树,只需每次选取结合中最小的2个节点,然后相加在放入集合。这就是哈夫曼树建立的思想。因此在选取两个节点后:
WPL = WPL + a + b,直到集合中仅有一个节点。
刚好有一道机试题目: