标题: 二叉树的加权路径长度是二叉树中所有叶节点的加权路径长度的总和. 给定的二进制链表的存储节点结构为
左|重量|对
存储叶节点的非负权重. 二叉树加权路径长度WPL的设计算法.
WPL =叶节点的权重∑×从节点到根节点的分支数量
示例:
非递归算法
算法思想: 根据公式,需要记录从每个节点到根节点的分支数. 此过程(在队列的帮助下)通过遍历树来记录宽度.
在非叶节点中带权路径长度,初始权重值为-1,并且将叶节点的初始值设置为非负权重值.
最后带权路径长度,逐个访问队列,如果权重!= -1,则计算出点数.
wpl + =(Q [i] .p-> weigth)*(Q [i] .p-> lno-1); // WPL公式代码
这里是转换队列的节点结构
typedef struct {
LBTree * p; //树的节点
int lno; //节点深度
}队列;
伪代码
typedef struct
{
LBTree* p;
int lno;
}Queue;
int WPL(LBTree* lbt)
{
Queue Q[maxSize];
int front,rear;
front = rear = 0;
int Lno = 1;
LBTree* q = lbt;
Q[rear].p = q;
Q[rear].lno = Lno;
rear++;
while (front != rear)
{
q = Q[front].p;
Lno = Q[front].lno;
front++;
if (q->lchild != NULL)
{
Q[rear].p = q->lchild;
Q[rear].lno = Lno + 1;
rear++;
}
if (q->rchild != NULL)
{
Q[rear].p = q->rchild;
Q[rear].lno = Lno + 1;
rear++;
}
}
int wpl = 0;
for (int i = 0; i < rear; i++)
{
if (Q[i].p->weigth != -1)
wpl += (Q[i].p->weigth) * (Q[i].p->lno - 1);
}
return wpl;
}
递归算法(推荐)
算法描述: 该算法基于统计叶节点算法. 参数列表中仅定义了从节点到根的分支数. 执行递归计算.
代码如下:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-274213-1.html