设计算法求二叉树的带权路径长度(WPL)
发布时间
阅读量:
阅读量
设计算法求二叉树的带权路径长度(WPL)
二叉树的带权路径长度(WPL)等于其所有终端节点到根节点的加权距离总和
队列的基本操作以严蔚敏编写的教材为准。
基于层次遍历的算法:
int WPL_LevelOrder (BiTree T)
{
int L = 0; //L是当前层结点到根节点的路径长度,即所经过的边的个数
int WPL = 0; //WPL为二叉树的带权路径长度
BiTNode *p; //p为遍历指针
InitQueue(Q); //初始化队列
EnQueue(Q, T) //根节点入队
while (!QueueEmpty(Q)) //队不空则循环
{
for (int i = 0; i < QueueLength(Q); ++i) //循环遍历每一层的结点
{
DeQueue(Q, p); //队头结点出队
if (p->lchild == NULL && p->rchild == NULL)
//若为叶结点,则累积WPL,p->weight为该结点的权值
WPL = WPL + p->weight * L;
if (p->lchild != NULL) //左子树不空则入队
EnQueue(Q, p->lchild);
if (p->rchild != NULL) //右子树不空则入队
EnQueue(Q, p->rchild);
}
L++; //路径长度加1
}
return WPL; //返回带权路径长度WPL
}
基于先序递归遍历的算法实现:
int WPL(BiTree T)
{
return WPL_PreOrder(T, 0);
}
int WPL_PreOrder(BiTree T, int deep)
{
static int WPL = 0; //定义一个static变量存储WPL
if (T->lchild == NULL && T->rchild == NULL) //若为叶结点,则累积WPL
WPL += deep * T->weight;
if (T->lchild != NULL) //若左子树不空,则对左子树递归遍历
WPL_PreOrder(T->lchild, deep + 1);
if (T->rchild != NULL) //若右子树不空,则对右子树递归遍历
WPL_PreOrder(T->rchild, deep + 1);
return WPL; //返回带权路径长度WPL
}
全部评论 (0)
还没有任何评论哟~
