题目描述
计算一棵二叉树的带权路径总和,即求赫夫曼树的带权路径和。
已知一棵二叉树的叶子权值,该二叉树的带权案路径和APL等于叶子权值乘于根节点到叶子的分支数,然后求总和。如下图中,叶子都用大写字母表示,权值对应为:A-7,B-6,C-2,D-3
树的带权路径和 = 7*1 + 6*2 + 2*3 + 3*3 = 34
本题二叉树的创建参考前面的方法
输入
第一行输入一个整数t,表示有t个二叉树
第二行输入一棵二叉树的先序遍历结果,空树用字符‘0’表示,注意输入全是英文字母和0,其中大写字母表示叶子
第三行先输入n表示有n个叶子,接着输入n个数据表示n个叶子的权值,权值的顺序和前面输入的大写字母顺序对应
以此类推输入下一棵二叉树
输出
输出每一棵二叉树的带权路径和
输入输出样例
输入样例1 <-复制
2
xA00tB00zC00D00
4 7 6 2 3
ab0C00D00
2 10 20
输出样例1
34
40
AC代码
#include<iostream> //注意:这是特殊情况,因为叶子是大写字母,所以确定叶子指针放入队列之后逆序求层数
#include<queue> //如果叶子不是大写字母的话可以根据左右孩子为空确定叶子再入队列
#include<string>
using namespace std;
struct binode
{
char data;
int quan;
binode* lchild, * rchild, * parent;
};
queue<binode*>q;
void create(binode*& node)
{
char data;
cin >> data;
if (data == '0')
node = NULL;
else
{
node = new binode;
node->data = data;
create(node->lchild);
if (node->lchild != NULL)
node->lchild->parent = node;
create(node->rchild);
if (node->rchild != NULL)
node->rchild->parent = node;
if (data >= 'A' && data <= 'Z')
q.push(node);
}
}
int ceng(binode* node,binode *root)
{
int k = 1;
while (node->parent != root)
{
k++;
node = node->parent;
}
return k;
}
int main()
{
int t;
cin >> t;
binode* root;
while (t--)
{
create(root);
getchar();
int n;
cin >> n;
int all = 0;
while (n--)
{
int shu;
cin >> shu;
all += shu * ceng(q.front(), root);
q.pop();
}
cout << all << endl;
}
}
(by 归忆)