給出二叉樹的中序和後序遍曆,求樹的根到葉的最小結點和的路徑上的分葉節點的值;思路是在後序找出根,在中序遍曆中找出其位置,確定左右兒子,遞迴建樹,在建樹的過程直接構建所求。
#include <cstdio>#include <string.h>const int maxn=255;const int Inf=0x7fffffff;char instr[maxn];char pstr[maxn];int num[10],cnt,head[maxn];int node1 [50];int node2 [50];struct edge{ int v,adj,next;}e[maxn];int min,ans;void build (int n , int* n1 , int * n2,int sum){ if(n==0)return ; sum+=*(n2+n-1); if(n==1) { if(min>sum) {min=sum ; ans=(*n1);} return ; } int pos=-1; for (int i=0 ; i<n ; ++i)if(n1[i]==n2[n-1]){pos=i;break;} //printf("pos=%d\n",pos); build(pos,n1,n2,sum); build(n-pos-1,n1+pos+1,n2+pos,sum); //printf("%d \n",node2[n-1]);}int main (){ int n,t,i; scanf("%d",&t); getchar(); while (t--) { min=Inf; cnt=0; memset (head,-1,sizeof(head)); gets(instr); gets(pstr); int len =strlen(instr); int len2 =strlen(pstr); int t,cnt=0,p; for (i=0 ,p=0; i<len ; i++) { if(instr[i+1]==' ' ||instr[i+1]=='\0') { num[p++]=instr[i]-'0'; if(p==1)node1[cnt]=num[0]; if(p==2)node1[cnt]=num[0]*10+num[1]; if(p==3)node1[cnt]=num[0]*100+num[1]*10+num[2]; cnt++; p=0; } else if(instr[i]!=' ')num[p++]=instr[i]-'0'; //printf("%d\n",num[p]); } cnt=0; for (i=0 ,p=0; i<len ; i++) { if(pstr[i+1]==' ' || pstr[i+1]=='\0') { num[p++]=pstr[i]-'0'; if(p==1)node2[cnt]=num[0]; if(p==2)node2[cnt]=num[0]*10+num[1]; if(p==3)node2[cnt]=num[0]*100+num[1]*10+num[2]; cnt++; p=0; } else if(pstr[i]!=' ')num[p++]=pstr[i]-'0'; } for (i= 0 ; i< cnt ;++i ) build(cnt,node1,node2,0); printf("%d\n",ans); } return 0;}