poj2418~Hardwood Species~二叉排序树
2014-08-07 18:26
405 查看
二叉排序树的概念很简单,就是对于树里的每个节点。它的左孩子总是比它小,它的右孩子总是比它大。这样子从根节点开始寻找某个节点时就非常简单,如果比根节点大就去右子树找,比根节点小就去左子树找。
若要从小到大输出节点,那么就是一个中序遍历的过程
对于这题,输入时是无序输入,但是输出却需要按字典序输出,如果用sort会非常费时,这时候二叉排序树的优点就特别明显了#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int sum;
typedef struct Tree
{
char s[35];
int num;
Tree *lchild;
Tree *rchild;
};
void insert(Tree *t,char *S)
{
if(t->num==0) //如果这个点还未放入字符串,则放入字符串
{
t->lchild=new Tree;
t->rchild=new Tree;
t->lchild->num=0;
t->rchild->num=0;
strcpy(t->s,S);
t->num=1;
}
else
{
if(strcmp(S,t->s)>0) //若 S 比这个节点的字符串s要大,则插入右子树中,否则插入左子树
{
insert(t->rchild,S);
}
else if(strcmp(S,t->s)<0)
{
insert(t->lchild,S);
}
else t->num++;
}
}
void dfs(Tree *T)
{
if(T->num!=0) //按中序遍历,得到的就是按顺序输出
{
dfs(T->lchild);
printf("%s",T->s);
printf(" ");
printf("%.4lf\n",(double)(T->num*100)/(double)(sum));
dfs(T->rchild);
}
}
int main()
{
char str[35];
Tree *root;
root=new Tree;
root->num=0;
sum=0;
while(gets(str)!=NULL)
{
insert(root,str);
sum++;
}
dfs(root);
}
相关文章推荐
- POJ2418 Hardwood Species
- [poj2418]Hardwood Species
- POJ 2418 Hardwood Species(二叉排序树)
- POJ 2418 Hardwood Species(二叉搜索树\二叉排序树)
- poj2418 - Hardwood Species
- poj 2418 Hardwood Species(二叉排序树||map迭代器)
- POJ2418--- Hardwood Species
- 二叉排序树:POJ2418-Hardwood Species(外加字符串处理)
- POJ 2418 Hardwood Species 二叉排序树
- poj2418 Hardwood Species
- POJ 2418 Hardwood Species 二叉排序树
- poj2418(Hardwood Species)
- POJ2418 Hardwood Species(二叉搜索树+字典树+MAP)
- poj2418 Hardwood Species
- POJ2418 Hardwood Species(字典树+字符串排序)
- poj 2418 Hardwood Species(二叉排序树)
- POJ2418--Hardwood Species【map】
- POJ2418:字典树:Hardwood Species(二叉搜索树)
- poj2418 Hardwood Species 排序二叉树
- POJ2418Hardwood Species