【14统考】二叉树的带权路径长度WPL是二叉树中所有叶结点的带权路径之和。给定一棵二叉树T,采用二叉链表存储,结点结构为 left | weight | right 其中叶结点的weight域保存该结点的非负权值,设root为指向T的根节点的指针,请设计求T的WPL的算法。
1、非递归
typedef struct {
int weight;
struct BiTNode *left,*right;
}BiTNode,*BiTree;
int Sum_WPL(BiTree T){
BiTree Q(MaxSize);//Q[0]不存储
Q[++rear]=T;
BiTNode *p;
int wpl=0,level=1,last=1;
int front=0;rear=0;
while(front<rear){
p=Q[++front];
if(p->left=NULL&&p->right=NULL){
wpl+=level*p->weight;
}else{
if(p->left)
Q[++rear]=p->left;
if(p->right)
Q[++rear]=p->right;
}
if(front==last){
level++;
last=rear;
}
}
}
2、递归
int wpl(BiTree T,int deep){
int wpl=0;
if(T->left==NULL&&T->right==NULL)
wpl+=deep*T->weight;
if(T->left!=NULL)
wpl(T->left,deep+1);
if(T->right!=NULL)
wpl(T->right,deep+1);
return wpl;
}
int WPL(BiTree T) {
return wpl(T,0);
}