根据题目的输入建立一颗二叉搜索树,并在节点中开一个域表示出现的次数。也可以用map来解决。下面是具体代码
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <fstream>
#include <istream>
#include <ostream>
#include <complex>
#include <cstring>
#include <utility>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <new>
#include <set>
#include <map>
using namespace std;
typedef pair<int, int> pii;
typedef long long int LL;
const int INF = 0x3f3f3f3f;
const int maxn = 1000005;
int cnt = 0;
struct Node{
char name[35];
int num;
Node *lc, *rc;
Node(){num = 1; lc = rc = NULL;}
};
Node* Insert(Node *root, char* x){//把x插入到搜索树中
if (!root){
Node *p = new Node();
strcpy(p->name, x);
return p;
}else{
if (!strcmp(x, root->name)) root->num++;
else if (strcmp(x, root->name) < 0) root->lc = Insert(root->lc, x);
else root->rc = Insert(root->rc, x);
return root;
}
}
void Inorder_view(Node *root){
if (root){
if (root->lc) Inorder_view(root->lc);
printf("%s %.4f\n", root->name, (root->num * 100.0) / cnt);
if (root->rc) Inorder_view(root->rc);
}
}
int main()
{
//freopen("1.txt", "r", stdin);
char tree[35];
Node *root = NULL;
while (gets(tree)){
root = Insert(root, tree);
cnt++;
}
Inorder_view(root);
return 0;
}