【POJ No. 2418】硬木种类 Hardwood Species
其实之前我们已经做过这个题了
https://blog.csdn.net/weixin_44226181/article/details/126742197
不过之前我们的思路是直接排序
这次我们使用【二叉搜索树】实现一下
【题意】
某国有数百种硬木树种,该国自然资源部利用卫星成像技术编制了一份特定日期每棵树的物种清单。计算每个物种占所有种群的百分比。
【输入输出】
输入:
输入包括每棵树的物种清单,每行一棵树。物种名称不超过30个字符,不超过10 000种,不超过1 000 000棵树。
输出:
按字母顺序输出植物种群中代表的每个物种的名称,然后是占所有种群的百分比,保留小数点后4位。
【样例】
【算法设计】
其实两种方法都可以解决
(1)使用二叉搜索树,先将每个单词都存入二叉树中,每出现一次,就修改该单词所在节点cnt++;最后通过中序遍历输出结果。
(2)排序后统计,并输出结果。
【算法实现】【二叉搜索】
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int sum = 0;
typedef struct node{
string word;
struct node *l , *r;
int cnt;
}*nodeptr;
nodeptr rt;
string w;
void insertBST(nodeptr &root , string s){ //将字符串s 插入到二叉搜索树root 中
if(root == NULL){
nodeptr p = new node;
p->l = p->r = NULL;
p->cnt = 1;
p->word = s;
root = p;
}
else if(s == root->word){
root->cnt ++;
}
else if(s < root->word ){
insertBST(root->l , s);
}
else {
insertBST(root->r , s);
}
}
void midprint(nodeptr root){ //中序遍历
if(root != NULL){
midprint(root->l);
cout << root->word;
printf(" %.4lf\n" , ((double)root->cnt / (double)sum) * 100);
midprint(root->r);
}
}
int main(){
rt = NULL; //一定要初始化
while(getline(cin , w)){ //输入完回车,按Ctrl + z ,回车
insertBST(rt , w);
sum ++;
}
midprint(rt);
return 0;
}