设Huffman树已采用二叉链表结构存储,求树的带权路径长度(WPL)的算法入下。其中ht为树根节点的指针,S为指针类型的栈(栈说明符为stype()),clearstack(s),puch(S,p),pop(S)和emptystack(S)分别为置栈空丶指针p进栈丶出栈和判断栈是否为空的函数。
算法:
typedef float weight;
typedef struct hnode{
weight w;
struct hnode *lchild,*rchild;
}hnode,*htptr;
weight HWPL(htpr ht){
htpr p;//定义指针类型结构体p
stype S;//声明栈S
weight cwpl;//定义浮点类型cwpl
cwpl=0;//cwpl赋初值
clearstack(S);//清空栈S
p=ht;//p作为遍历指针,指向根结点
while(p || emptystack(S)){//大循环的条件是p不为空或栈不为空
while(p->lchild){//红色字体部分为中序递归算法的核心部分
push(S,p);
p=p->lchild;
}
p=pop(S);
if(p->lchild)//哈夫曼带权路径的另一种算法,见下图
cwpl+=p->weight;
p=p->rchild;
}
return(cwpl);
}