POJ2418-Hardwood Species

来源:互联网 发布:网络慈善活动策划方案 编辑:程序博客网 时间:2024/05/21 17:49

【题目来源】http://poj.org/problem?id=2418

【题目思路】二叉搜索树

【解题感想】题目就是让你统计各种树木占总量的比例,但数据量非常大。本来想用STL的map的,但是听说会超时,还是没有用,自己写了一个BST。这是我第一次写BST,开始时候完全照pascal语言写的模板抄,但是实际实现时候在指针传递的时候发现一些问题,于是放弃了用指针传来传去的函数模板。不过我还是说一下遇到的问题吧,以备后用,C++对指针的传递也是值传递。在函数内对指针值得改变仍然不影响函数外的指针。如果想在函数内改变外部的指针,有三种解决办法,第一种是按指针的引用传递,比如 int* & parameter;第二种是给函数传递一个二重指针,借助二重指针修改一重的指针;第三种是在函数内return一个指针值。 

还有一点需要注意的是,在使用new来分配内存的时候,被分配内存的自定义对象必须有构造函数。这与malloc是不同的,不过比起malloc复杂的指针转化,我还是宁愿写一个构造函数。

在POJ上交这道题的时候,一开始用的cin读入字符串,结果10000ms的时限直接用了9700多ms,换成scanf读入就只用了1200多ms。不过简单起见,该处代码我还是用cin读入

【代码】

#include <iostream>#include <iomanip>#include <cstdlib>using namespace std;struct BSTnode{    string species;    double    cnt;    BSTnode *left,*right;    BSTnode()    {        species="";        cnt=0;        left=right=NULL;    }};int tot=0;void insert(BSTnode*& root,string x){    BSTnode* ptr=root;    while (true)    {        if (root==NULL)        {            BSTnode* pNode=new BSTnode;            pNode->cnt=1;            pNode->left=NULL;            pNode->right=NULL;            pNode->species=x;            root=pNode;            return;        }        if (ptr->species == x)        {            (ptr->cnt)+=1;            return;        }        else if (x > ptr->species)        {            if (ptr->right == NULL)            {                BSTnode* pNode=new BSTnode;                pNode->cnt=1;                pNode->left=NULL;                pNode->right=NULL;                pNode->species=x;                ptr->right=pNode;                return;            }            else                ptr=ptr->right;        }        else        {            if (ptr->left == NULL)            {                BSTnode* pNode=new BSTnode;                pNode->cnt=1;                pNode->left=NULL;                pNode->right=NULL;                pNode->species=x;                ptr->left=pNode;                return;            }            else                ptr=ptr->left;        }    }}void in_order_traversal(BSTnode* root){    if (root==NULL)        return;    else    {        in_order_traversal(root->left);        //cout<<root->species<<' '<<root->cnt<<endl;        cout<<root->species<<' '<<fixed<<setprecision(4)<<(root->cnt)/(double)tot*100<<endl;        in_order_traversal(root->right);    }}int main(){    string str;    BSTnode* root=NULL;    while (getline(cin,str))    {        ++tot;        insert(root,str);    }    in_order_traversal(root);    return 0;}


原创粉丝点击