Tree UVA - 548(二叉樹遞歸遍歷)
阿新 • • 發佈:2019-02-03
out pac col sstream end 遍歷 std 二叉 con
題目鏈接:https://vjudge.net/problem/UVA-548
題目大意:給一顆點帶權(權值各不相同,都是小於10000的正整數)的二叉樹的中序遍歷和後序遍歷,找一個葉子結點使得它到根的路徑上的權值和最小。如果有多個解,該葉子本身的權值應盡量小。輸入中每兩行表示一棵樹,其中第一行為中序遍歷,第二行為後續遍歷。
看代碼:
#include<iostream> #include<string.h> #include<stdio.h> #include<vector> #include<queue> #include<sstream> usingnamespace std; const int maxv=10000+5; int in_order[maxv],post_order[maxv],lch[maxv],rch[maxv]; int n; int best,best_sum;//目前為止最優解和對應的權值和 bool read_list(int *a) { string line; if(!getline(cin,line)) return false;//文件結束 stringstream ss(line); n=0; int x; while(ss>>x) a[n++]=x;//應用字符串流進行輸入return n>0; } int build(int L1,int R1,int L2,int R2) { if(L1>R1) return 0;//空樹 int root=post_order[R2];//後序遍歷最後一個結點就是樹根 int p=L1; while(in_order[p]!=root) p++;//在中序遍歷中找到根結點所在的位置 int cnt1=p-L1;//左子樹結點的個數 lch[root]=build(L1,p-1,L2,L2+cnt1-1); rch[root]=build(p+1,R1,L2+cnt1,R2-1); return root; } void dfs(int u,int sum) { sum+=u; if(!lch[u]&&!rch[u])//代表葉子結點 { if(sum<best_sum||(sum==best_sum&&u<best)) { best=u; best_sum=sum; } } if(lch[u]) dfs(lch[u],sum); if(rch[u]) dfs(rch[u],sum); } int main() { while(read_list(in_order)) { read_list(post_order); build(0,n-1,0,n-1); best_sum=1000000000; dfs(post_order[n-1],0); cout<<best<<endl; } return 0; }
Tree UVA - 548(二叉樹遞歸遍歷)