您的位置:首页 > 其它

POJ2418-Hardwood Species

2013-08-04 20:52 363 查看
【题目来源】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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OJ