现有一棵n个结点的树(结点编号为从0到n-1,根结点为0
号结点),每个结点有各自的权值w。
- 结点的路径长度是指,从根结点到该结点的边数;
- 结点的带权路径长度是指,结点权值乘以结点的路径长度;
- 树的带权路径长度是指,树的所有叶结点的带权路径长度之和。
求这棵树的带权路径长度。
解题思路:每个节点存储weight和height值。
然后利用遍历,当遍历到叶子节点时候,sumweight加上当前节点的带权路径值。
完整代码如下:
#include <iostream>
#include <vector>
using namespace std;
struct node{
int height = 0;
int weight;
vector<int> child;
} nodes[51];
bool flag = false;
int sumweight = 0;
void PreOrderTraverse(int root){
if(root == -1){
return ;
}
if(nodes[root].child.size()==0){
sumweight += nodes[root].weight*nodes[root].height;
}
for(int i=0;i<nodes[root].child.size();i++){
nodes[nodes[root].child[i]].height = nodes[root].height+1;
PreOrderTraverse(nodes[root].child[i]);
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>nodes[i].weight;
}
for(int i=0;i<n;i++){
int k;
cin>>k;
int temp;
for(int j=0;j<k;j++){
cin>>temp;
nodes[i].child.push_back(temp);
}
}
PreOrderTraverse(0);
cout<<sumweight<<endl;
return 0;
}