ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

10-C. DS树--带权路径和

2021-11-29 13:02:42  阅读:151  来源: 互联网

标签:10 preorder -- height btnode int 带权 二叉树 权值


10-哈夫曼编码及综合

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

已知一棵二叉树的叶子权值,该二叉树的带权案路径和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<string>
using namespace std;
class btnode
{
    public:
        char data;
        int weight;//权值
        int height;//高度
        btnode *lchild;
        btnode *rchild;
        btnode():weight(0),height(0),lchild(NULL),rchild(NULL){}
        ~btnode(){}
};

class bitree //二叉树
{
    btnode *root;
    int pos,p;
    int APL;
    string strtree;
    btnode *createbitree(int *w,int h)
    {
        btnode *T;
        char ch;
        ch=strtree[pos++];
        
        if(ch=='0') //空树
            T=NULL;
        else
        {
            T=new btnode();
            T->data=ch;
            T->height=h+1;//高度加一
            if(T->data>='A'&&T->data<='Z')
                T->weight=w[p++];//记录权值的数组
            
            T->lchild=createbitree(w,T->height);
            T->rchild=createbitree(w,T->height);
        }
        return T;
    }
    
    void preorder(btnode *t)//先序遍历
    {
        if(t)
        {
            APL += t->weight*t->height;//这个结点的路径和
            preorder(t->lchild);
            preorder(t->rchild);
        }
    }
    
    public:
        bitree(){APL=0;};
        ~bitree(){};
        void createbitree(string treearray,int *w)
        {
            pos=0;
            p=0;
            strtree.assign(treearray);
            root=createbitree(w,-1);
        }
    
        void preorder()
        {
            root->height=1;//根结点的高度是1
            preorder(root);
            cout<<APL<<endl;
        }
};

int main()
{
    int t,n,i;
    cin>>t;
    while(t--)
    {
        string tree;
        int w[100];
        bitree T;
        
        cin>>tree>>n;
        for(i=0;i<n;i++)
            cin>>w[i];//n个叶子的权值
        
        T.createbitree(tree,w);
        T.preorder();//cout<<APL
    }
    return 0;
}

标签:10,preorder,--,height,btnode,int,带权,二叉树,权值
来源: https://blog.csdn.net/bianchengfive/article/details/121607088

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有