树(BFS),紫书P155UVa548

来源:互联网 发布:最好的英文翻译软件 编辑:程序博客网 时间:2024/05/18 15:56

本题也是非常经典的利用二叉树中序和先序(或者后续)遍历的数据,还原成原始二叉树的结构。由于本题的节点权值题目中规定不重复,顾刘采用了数组来存储二叉树。这在上一道题树的层序遍历中是行不通的,在节点权值重复的情况下用数组模拟二叉树,只能按照完全二叉树的方式来模拟,数据量太大的情况下数组是开不下的。
本题二叉树生成和遍历都是基于数组的操作,可以把本题当做一个数组二叉树的模板吧。
build函数与dfs函数是本题目的核心。要反复复习思考。

// UVa548 Tree// Rujia Liu#include<iostream>#include<string>#include<sstream>#include<algorithm>using namespace std;const int maxv = 10000 + 10;int in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];int n;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 cnt = p-L1;   lch[root] = build(L1, p-1, L2, L2+cnt-1);  rch[root] = build(p+1, R1, L2+cnt, R2-1);  return root;}int best, best_sum; 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 << "\n";  }  return 0;}
原创粉丝点击