现有一棵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;
}