您的位置:首页 > 其它

poj2418~Hardwood Species~二叉排序树

2014-08-07 18:26 363 查看


二叉排序树的概念很简单,就是对于树里的每个节点。它的左孩子总是比它小,它的右孩子总是比它大。这样子从根节点开始寻找某个节点时就非常简单,如果比根节点大就去右子树找,比根节点小就去左子树找。
若要从小到大输出节点,那么就是一个中序遍历的过程
 
对于这题,输入时是无序输入,但是输出却需要按字典序输出,如果用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);
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉排序树