DS树--带权路径和

Posted szu-ds-wys

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS树--带权路径和相关的知识,希望对你有一定的参考价值。

题目描述

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

已知一棵二叉树的叶子权值,该二叉树的带权案路径和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个叶子的权值,权值的顺序和前面输入的大写字母顺序对应

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

 

输出

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

样例输入

2 xA00tB00zC00D00 4 7 6 2 3 ab0C00D00 2 10 20

样例输出

34 40

提示

#include<iostream>
#include<string>
using namespace std;
class BitreeNode
{
public:
    char data;
    int weight;
    int height;
    BitreeNode *left;
    BitreeNode *right;
    BitreeNode()
    {
        weight=0;
        height=0;
        left=NULL;
        right=NULL;
    }
};
 
class Bitree
{
public:
    BitreeNode *Root;
    int pos,index;///index控制数组非0权值
    string strtree;
    int API;
    Bitree(int *w,string str)
    {
        pos=index=0;
        API=0;
        strtree=str;
        Root=CreateBitree(w,0);///根结点无双亲,双亲高度为0
    }
    BitreeNode *CreateBitree(int *w,int fatherheight)
    {
        char ch=strtree[pos];
        pos++;
        if(ch==0)
        {
            return NULL;
        }
        else
        {
            BitreeNode *T=new BitreeNode();
            T->data=ch;
            T->height=fatherheight+1;
            if(T->data>=A&&T->data<=Z)
            {
                T->weight=w[index];
                index++;
            }
            T->left=CreateBitree(w,T->height);
            T->right=CreateBitree(w,T->height);
            return T;
        }
    }
    void preorder(BitreeNode *T)
    {
        if(T!=NULL)
        {
            API+=T->weight*(T->height-1);///高度减1才是对应乘的值
            preorder(T->left);
            preorder(T->right);
        }
        return;
    }
};
 
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string str;
        cin>>str;
        int n;
        cin>>n;
        int *a=new int[n];
        for(int i=0;i<n;i++)
            cin>>a[i];
        Bitree Tree(a,str);
        Tree.preorder(Tree.Root);
        cout<<Tree.API<<endl;
    }
    return 0;
}

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

数据结构 赫夫曼树

博客作业04--树

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

《大话数据结构》笔记(6-3)--树:赫夫曼树

数据结构_哈夫曼树

数据结构中赫夫曼树