http://poj.org/problem?id=2418
/*
二叉查找树:对于树中的每个节点X,它的左子树中的所有节点的值小于X的值,它的右子树中的所有节点的值大于X的值;
*/
题目大意:给出一些单词(包含大小写和空格),单词可以重复出现(单词最多10000种,最多1000000个)。要求按字典序输出单词并输出每个单词占的比例;
思路:单词的比较可以用strcmp,由于单词数较多,直接排序可能超时,若用字典树的话需要的空间较大。因此可以考虑将单词作为二叉查找树的关键字建树,然后按中序遍历输出。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
struct node
{
char word[33];
int cnt;
node *left,*right;
node(char *n){
strcpy(word,n);
cnt=1;
left=NULL;
right=NULL;
}
}*root;
double count;
//插入二叉查找树
node* insert(char *word,node *p)
{
if(p==NULL){
p=new node(word);
}
else if(strcmp(word,p->word)<0)
p->left=insert(word,p->left);
else if(strcmp(word,p->word)>0)
p->right=insert(word,p->right);
else
p->cnt++;
return p;
}
//输出中序遍历结果
void output(node *p)
{
if(p==NULL)
return;
output(p->left);
printf("%s %.4lf\n",p->word,(p->cnt)/count*100);
output(p->right);
delete p;
}
int main()
{
char word[33];
count=0;
while(gets(word)){
root=insert(word,root);
count++;
}
output(root);
return 0;
}