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树--带权路径和的主要内容,如果未能解决你的问题,请参考以下文章