比赛 |
20160407树结构练习 |
评测结果 |
AAAAE |
题目名称 |
树 |
最终得分 |
80 |
用户昵称 |
@@@ |
运行时间 |
0.123 s |
代码语言 |
C++ |
内存使用 |
0.40 MiB |
提交时间 |
2016-04-07 20:34:51 |
显示代码纯文本
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
ifstream cin("sumtree.in");
ofstream cout("sumtree.out");
const int M=10001;
int in[M]/*中*/,post[M]/*后*/,n=0,maxn=0,len=0,best_sum=M,best=M,pt,m;
class node
{
public:
int data,lk,rk;
}tree[M];
int init()//初始化
{
pt=1;n=0;
best_sum=10001*10001;
best=10001;
for(int i=0;i<=maxn;i++)
{
in[i]=0;
post[i]=0;
tree[i].data=tree[i].lk=tree[i].rk=0;
}
return 0;
}
/////////////////////////////////////////////////
int read(int p[])//读取一行,淄墅摘醋旋嫒腴
{
string s="";
int x;
if(!getline(cin,s))
return 0;
stringstream fin(s);
n=0;
while(fin>>x)
p[++n]=x;//从下标1开始存储,n为结点个数
fin.str("");//清空串流缓冲区,节省内存
return n>0;
}
///////////////////////////////////////////
int pos(int x)//求x在数组中的位置,从1开始
{
int i;
for(i=1;i<=n;i++)
if(in[i]==x)
break;
return i;
}
////////////////////////////////////////////////////////////////////
int buildtree(int root,int li,int ri,int lp,int rp)
{
int p;
p=pos(post[rp]);
if(p<=li)
tree[root].lk=0;
else//有左子树
{
tree[root].lk=post[rp-(ri-p)-1];
buildtree(tree[root].lk,li,rp-(ri-p)-1,lp,rp-(ri-p)-1);
}
if(p>=ri)
tree[root].rk=0;
else//有右子树
{
tree[root].rk=post[rp-1];
buildtree(post[rp-1],p+1,ri,rp-(ri-p),rp-1);
}
return 0;
}
/////////////////////////////
int dfs(int i,int wn)
{
if(tree[i].lk==0&&tree[i].rk==0)
{
if(wn<=best_sum)
{
best_sum=wn;
best=min(best,i);
//cout<<i<<endl;
}
}
else
{
if(tree[i].lk) dfs(tree[i].lk,++wn),--wn;
if(tree[i].rk) dfs(tree[i].rk,++wn),--wn;
}
return 0;
}
/////////////////////////////
int main()
{
init();
while(read(in)&&read(post))
{
buildtree(post[n],1,n,1,n);
dfs(post[n],0);
cout<<best<<endl;
init();
}
//for(int i=1;i<=4 ;i++)
// cout<<i<<" "<<tree[i].lk<<' '<<tree[i].rk<<endl;
cin.close();
cout.close();
return 0;
}