码迷,mamicode.com
首页 > 其他好文 > 详细

DS树--带权路径和

时间:2020-01-11 20:30:21      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:iostream   mil   数据   --   ios   大写   family   顺序   赫夫曼   

题目描述

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

已知一棵二叉树的叶子权值,该二叉树的带权案路径和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树--带权路径和

标签:iostream   mil   数据   --   ios   大写   family   顺序   赫夫曼   

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!