Uva 248 Tree//二叉樹遍歷,遞迴
阿新 • • 發佈:2019-01-30
這道題剛開始糾結於輸入,還是題刷少了。囧!本來想用strchr函式和指標來操作的,但是在輸入的時候很糾結,就放棄了。這是poj 2255的加強版,不用真正的建樹後在遍歷,直接模擬建樹的過程就解決了。
下面是程式碼:
Come on!#include<stdio.h> #include<string.h> #define MAXN 10010 int ans,flag,n; int s1[MAXN],s2[MAXN]; int find_root(int b1,int e1,int e2) { for(int i=b1;i<=e1;++i)//剛開始的時候沒有等號,直接tle了,囧! { if(s1[i]==s2[e2]) return i; } } void rebuild(int b1,int e1,int b2,int e2,int sum) { if(b1>e1) return; sum+=s2[e2]; if(b1==e1) { if(sum<=ans) { if(sum==ans) { if(s2[e2]<flag) flag=s2[e2]; } else { ans=sum; flag=s2[e2]; } } return; } int p=find_root(b1,e1,e2);//找根節點的位置 rebuild(b1,p-1,b2,b2+p-b1-1,sum);//遞迴建左子樹 rebuild(p+1,e1,b2+p-b1,e2-1,sum);//遞迴建右子樹 } int main() { char ch; n=0; while(scanf("%d%c",&s1[n++],&ch)==2)//這樣輸入 { if(ch=='\n'){ for(int i=0;i<n;++i) scanf("%d",&s2[i]); ans=1000000000; rebuild(0,n-1,0,n-1,0); printf("%d\n",flag); n=0; } } return 0; }