树的遍历实战分析
题目描述: 已知一棵树,根节点存放货物价格,每往下走一层,价格在父节点上增加 r%。叶节点给出货物量,求其价格之和。如下图所示:
根节点处的价格为100,橘色部分为叶节点处的货物量。4、5、7号节点深度为2,9、10节点深度为3,那么价格为:
100×((10+20+40)×1.02×1.02+(30+50)×1.02×1.02)=15772.464。
题目分析: 从根节点开始,递归遍历其每个子节点,当某个节点的子节点个数为0时,则为叶节点。设置变量ans,存储叶节点的价格之和;变量depth,记录节点深度。
知识储备:
1)计算m的n次方,可使用 pow(m,n),返回m的n次方的值,需要添加头文件 cmath.h;
2)vector相比于数组而言,可以动态扩充容量,可以理解为动态数组。所以用vector存储数的孩子节点。
第一行输入节点个数,根节点的价格和 r 。后面的第i行代表第 i 个节点,每行的第一个元素为孩子节点个数,后面元素表示节点;如果为0时则为叶节点,后面元素为货物量。比如第一行3 1 2 3,指第一个节点有3个孩子,分别为1 2 3;第5行0 10,指第五个元素为叶节点,货物量为10。
运行结果:
代码如下:
#include<iostream>
#include<vector> //vector容器与数组相比其优点在于它能够根据需要随时
//自动调整自身的大小以便容下所要放入的元素。
#include<cmath>
using namespace std;
const int maxn=10010;
struct node{
double data;
vector<int> child; //存放其孩子节点
}Node[maxn];
int n;
double ans=0,p,r;
void DFS(int index, int depth){
if(Node[index].child.size()==0){ //叶节点
ans+=Node[index].data*pow(r+1,depth);
}
for(int i=0;i<Node[index].child.size();i++){ //递归访问子节点
DFS(Node[index].child[i],depth+1);
}
}
int main(){
cin>>n>>p>>r;
r=r/100;
for(int i=0;i<n;i++){
int k;
cin>>k;
if(k==0){ //k==0时是叶节点,输入其货物量
cin>>Node[i].data;
}else{
for(int j=0;j<k;j++){
int child;
cin>>child;
Node[i].child.push_back(child);
}
}
}
DFS(0,0);
cout<<ans*p;
return 0;
}