题目地址:UVA-548
一道炒鸡简单的题目硬生生WA了我十多次,最后发现是 --n和 n--搞反了。。。
练习的时候没什么。。
比赛的时候千万不要出现这种情况了。。
题目挺简单的,题目给出中序遍历和后序遍历,然后根据他们的特性用递归构建二叉树就好了
中序遍历:节点左边的点都是它的左子树。
后序遍历:一棵树的根节点一定是最后一个!
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node {
int data;
int value;
node *ls,*rs;
}*root;
int a[10005],b[10005];
int n,Min,p;
int find(int begin,int end) {
int max=-1,k=-1;
for(int i=begin; i<=end; i++) {
if(b[a[i]]>max) {
max=b[a[i]];
k=i;
}
}
return k;
}
void add(int n,node *Root,int t) {
node *temp=new node;
temp->data=n;
temp->value=Root->value+n;
temp->ls=NULL;
temp->rs=NULL;
if(t)
Root->ls=temp;
else
Root->rs=temp;
}
void creat(node *Root,int begin,int end) {
int k,i;
node *temp;
for(i=begin; i<=end; i++)
if(a[i]==Root->data)
break;
if(begin<i) {
k=find(begin,i-1);
add(a[k],Root,1);
}
if(end>i) {
k=find(i+1,end);
add(a[k],Root,0);
}
if(begin<i-1)
creat(Root->ls,begin,i-1);
if(i+1<end)
creat(Root->rs,i+1,end);
}
void show(node *Root) {
if(Root->ls)
show(Root->ls);
if(Root->rs)
show(Root->rs);
if(!Root->ls&&!Root->rs) {
if(Root->value<Min) {
Min=Root->value;
p=Root->data;
}
else if(Root->value==Min&&p>Root->data)
p=Root->data;
}
}
int input() {
memset(b,0,sizeof(b));
int k;
n=0;
Min=1;
while(1) {
if(scanf("%d",&a[n++])==EOF)
return 0;
if(!b[a[n-1]])
b[a[n-1]]=1;
else
break;
Min+=a[n-1];
}
b[a[--n]]=0;
for(int i=1; i<n; i++) {
scanf("%d",&k);
b[k]=i;
}
root =new node;
root->value=k;
root->data=k;
root->ls=NULL;
root->rs=NULL;
return 1;
}
int main() {
while(input()) {
creat(root,0,n-1);
show(root);
printf("%d\n",p);
}
return 0;
}