比赛 20160407树结构练习 评测结果 AAAAE
题目名称 最终得分 80
用户昵称 @@2@ 运行时间 0.123 s
代码语言 C++ 内存使用 0.40 MiB
提交时间 2016-04-07 20:10:50
显示代码纯文本
#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<=M;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; 
}