问题 A: DS树--带权路径和

简介: 问题 A: DS树--带权路径和

题目描述

计算一棵二叉树的带权路径总和,即求赫夫曼树的带权路径和。

已知一棵二叉树的叶子权值,该二叉树的带权案路径和APL等于叶子权值乘于根节点到叶子的分支数,然后求总和。如下图中,叶子都用大写字母表示,权值对应为:A-7,B-6,C-2,D-3

树的带权路径和 = 71 + 62 + 23 + 33 = 34

输入

第一行输入一个整数t,表示有t个二叉树

第二行输入一棵二叉树的先序遍历结果,空树用字符‘0’表示,注意输入全是英文字母和0,其中大写字母表示叶子

第三行先输入n表示有n个叶子,接着输入n个数据表示n个叶子的权值,权值的顺序和前面输入的大写字母顺序对应

以此类推输入下一棵二叉树

输出

输出每一棵二叉树的带权路径和

样例输入

2

xA00tB00zC00D00

4 7 6 2 3

ab0C00D00

2 10 20

样例输出

34

40


  • 思路

在构建树的时候,存储深度,最后乘以权值

  • 代码实现
#include <iostream>
#include <algorithm>
using namespace std;
int ans;
class BTNode
{
public:
    char data;
    int depth;
    int weight;
    BTNode *lChild;
    BTNode *rChild;
    BTNode() : lChild(NULL), rChild(NULL){};
};
class BT
{
private:
    BTNode *root;
    string st;
    int pos;
    int length;
    BTNode *create(int dep);
    void preOrder(BTNode *t);
public:
    void create(string s);
    void preOrder();
};
void BT::create(string s)
{
    st.assign(s);
    pos = 0;
    length = st.length();
    root = create(0);
    if (pos >= length - 1)
    {
        return;
    }
}
BTNode *BT::create(int dep)
{
    BTNode *T;
    char ch;
    ch = st[pos++];
    if (ch == '0' || pos >= length)
    {
        return NULL;
    }
    T = new BTNode();
    T->data = ch;
    T->depth = dep;
    T->lChild = create(dep + 1);
    T->rChild = create(dep + 1);
    return T;
}
void BT::preOrder()
{
    preOrder(root);
}
void BT::preOrder(BTNode *t)
{
    if (t == NULL)
    {
        return;
    }
    if (!t->lChild && !t->rChild)
    {
        int num;
        cin >> num;
        ans += t->depth * num;
    }
    preOrder(t->lChild);
    preOrder(t->rChild);
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        ans = 0;
        string ss;
        cin >> ss;
        BT *bt = new BT();
        bt->create(ss);
        int tt;
        cin >> tt;
        if (tt != 0)
        {
            bt->preOrder();
        }
        cout << ans << endl;
        delete bt;
    }
    return 0;
}
相关文章
|
3天前
|
Shell
Shell遍历HDFS路径统计层级目录大小
Shell遍历HDFS路径统计层级目录大小
|
3天前
|
XML JavaScript 前端开发
DOM 属性列表(命名节点图 Named Node Map)
这段内容介绍了如何使用JavaScript操作XML文档中的DOM属性。通过`getElementsByTagName`获取元素后,`attributes`属性返回一个命名节点图(Named Node Map),表示元素的属性列表,该列表会自动更新。示例代码展示了加载&quot;books.xml&quot;,获取第一个`&lt;book&gt;`元素的属性列表,然后利用`getNamedItem()`方法获取&quot;category&quot;属性的值并输出,同时显示属性数量。
|
3天前
|
JavaScript
DOM 属性列表(命名节点图 Named Node Map)
这段内容介绍了DOM中的`attributes`属性,它返回元素节点的属性节点列表,形成一个命名节点图。这个列表自动更新,当属性增删时反映变化。示例代码展示了如何加载&quot;books.xml&quot;,获取第一个`&lt;book&gt;`元素的属性列表,然后使用`getNamedItem()`方法获取&quot;category&quot;属性的值并显示属性数量。输出为&quot;cooking&quot;和&quot;1&quot;。
|
3天前
|
JavaScript
Node fs 创建多层文件夹
Node fs 创建多层文件夹
5 0
|
11月前
|
移动开发 编解码 资源调度
分集与路径合并方式
分集与路径合并方式
112 0
分集与路径合并方式
|
算法
【CCCC】L3-011 直捣黄龙 (30分),Dijkstra维护点权,节点数,路径条数等+路径打印
【CCCC】L3-011 直捣黄龙 (30分),Dijkstra维护点权,节点数,路径条数等+路径打印
131 0
CF1286B.Numbers on Tree(构造 dfs)
CF1286B.Numbers on Tree(构造 dfs)
71 0
node26-系统模块path路径操作
node26-系统模块path路径操作
55 0
node26-系统模块path路径操作
ADI
|
机器学习/深度学习 JavaScript 算法
[记录]我的Diff算法学习路径
[记录]我的Diff算法学习路径
ADI
111 0