题目 :二叉树的带权路径长度是二叉树中所有叶子结点的带权路径长度之和。给定二叉链表的存储的结点结构为
left | weight| right
存储的是叶子结点的非负权值。设计算法求二叉树的带权路径长度WPL。
WPL = ∑ 叶子结点的权值 × 结点到根结点的分支个数
例如:
非递归算法算法思想:根据公式,需要记录每个结点到根结点的分支个数,这个过程通过对树进行广度遍历(借助队列)进行记录。
在非叶子结点weight初值为-1,叶子结点初值设为非负权值。
最后对队列进行逐个访问,如果weight != -1,那就计算该点。
wpl += (Q[i].p->weigth) * (Q[i].p->lno - 1); //WPL公式代码
这里改造队列的结点结构
typedef struct {
LBTree* p; //树的结点
int lno; //结点深度
}Queue;
伪代码
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