uva 548
这个题是一个关于利用二叉树的中序和后序来确定一棵树的题,先前全做的都是通过先序和中序来确定一颗二叉树,所以还想了好久。
总体思路就是,现将二叉树的后序遍历的顺序直接反转,然后通过后序遍历反转以后的第一个数字就是根节点,下来是右子树,下来是左子树以此类推就可以了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Tnode{
int value;
int node;
}Node;
Node value[30000];
int index=0,the_min=9999999;
void build(int n,int *s1,int *s2,int total){
int p;
if(n<=0)
return;
total+=s1[0];
if(n==1){
value[index].value=total;
value[index].node=s1[0];
index++;
if(the_min>total)
the_min=total;
}
p=search(s1[0],s2,n);
build(n-p-1,s1+1,s2+p+1,total);
build(p,s1+(n-p),s2,total);
}
int search(int num,int * arr,int len){
int i;
for(i=0;i<len;i++)
if(arr[i]==num)
return i;
return 0;
}
int reverse(int *arr,int len){
int i,temp;
for(i=0;i<len/2;i++){
temp=arr[i];
arr[i]=arr[len-i-1];
arr[len-i-1]=temp;
}
}
int main(){
int input1[30000],i=0,j,input2[30000],flag=0,total=0,k;
char ch;
while(scanf("%d%c",input1+i,&ch)==2){
if(ch=='\n')
flag=1;
else
i++;
while(flag==0 && scanf("%d%c",input1+i,&ch)==2){
if(ch=='\n')
break;
i++;
}
for(j=0;j<=i;j++)
scanf("%d%*c",input2+j);
reverse(input2,j);
build(j,input2,input1,total);
flag=i=0;
for(k=0;k<index;k++)
if(value[k].value==the_min)
printf("%d\n",value[k].node);
index=0;
the_min=99999999;
}
return 0;
}