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

Posted 一腔诗意醉了酒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 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;
}


以上是关于问题 A: DS树--带权路径和的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 赫夫曼树

哈夫曼树

博客作业04--树

Huffman树

求哈夫曼树的带权路径长度和

树——哈夫曼树和哈夫曼编码