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;
}