1. 程式人生 > >Tree UVA - 548(二叉樹遞歸遍歷)

Tree UVA - 548(二叉樹遞歸遍歷)

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>
using
namespace 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(二叉樹遞歸遍歷)