zoukankan      html  css  js  c++  java
  • PAT 1086

    题目链接 :http://www.patest.cn/contests/pat-a-practise/1086

    这道题之前用idx做过一遍,今天用iterator做了一遍,果然C++的iterator还是觉得别扭,但感觉比以前好多了。

    从题目给的数据中能够知道该树的前序遍历和中序遍历的结果,push过程的顺序是前序遍历,pop出来的内容逐个取出是中序遍历。然后再递归得到后序遍历的结果。递归的过程也即从前序遍历拿出第一个元素,在中序中找到,求出left和right的大小,再进行下面的递归。

    代码:

     1 #include <fstream>
     2 #include <vector>
     3 #include <iostream>
     4 #include <stack>
     5 #include <string>
     6 #include <algorithm>
     7 
     8 using namespace std;
     9 
    10 //#define OJ
    11 #ifdef OJ
    12 #define fin cin
    13 #else
    14 ifstream fin("in.txt");
    15 #endif
    16 
    17 vector<int> pre_order;
    18 vector<int> in_order;
    19 vector<int> post_order;
    20 int n;
    21 
    22 typedef vector<int>::iterator iter_type;
    23 
    24 void solve(iter_type pre_begin, iter_type pre_end, iter_type in_begin, iter_type in_end, iter_type post_begin, iter_type post_end){
    25     if (pre_begin == pre_end)
    26         return;
    27 
    28     iter_type mid_iter;
    29     for (mid_iter = in_begin; mid_iter != in_end; mid_iter++)
    30         if (*mid_iter == *pre_begin)
    31             break;
    32     int left = distance(in_begin, mid_iter);
    33     int right = distance(next(mid_iter), in_end);
    34     *prev(post_end) = *mid_iter;
    35 
    36     if (left > 0)
    37         solve(next(pre_begin), next(pre_begin, left + 1), in_begin, mid_iter, post_begin, next(post_begin, left));
    38     if (right > 0)
    39         solve(prev(pre_end, right), pre_end, next(mid_iter), in_end, next(post_begin, left), prev(post_end));
    40 }
    41 
    42 int main(){
    43     string str;
    44     fin >> n;
    45 
    46     getline(fin, str);
    47 
    48     pre_order.reserve(n);
    49     in_order.reserve(n);
    50     post_order.resize(n);
    51     stack<int> s;
    52     while (getline(fin, str)){
    53         if (str.size() == 3){
    54             in_order.push_back(s.top());
    55             s.pop();
    56         }
    57         else {
    58             int tmp = atoi(str.substr(5, str.size() - 5).c_str());
    59             pre_order.push_back(tmp);
    60             s.push(tmp);
    61         }
    62     }
    63     
    64     solve(pre_order.begin(), pre_order.end(), in_order.begin(), in_order.end(), post_order.begin(), post_order.end());
    65     cout << post_order[0];
    66     for (iter_type it = next(post_order.begin()); it != post_order.end(); it++){
    67         cout << " " << *it;
    68     }
    69     cout << endl;
    70 
    71     return 0;
    72 }
  • 相关阅读:
    安装spark-1.5遇到的一些问题
    spark遇到的一些问题及其解决办法
    spark-client 一直 accepted,无法提交任务,报错Failed to connect to driver at
    spark-sql用hive表格,在spark-submit运行jar包时遇到的问题
    hive streaming 使用的时候的一些心得
    [BZOJ]1063 道路设计(Noi2008)
    PKUWC2018划水记
    [BZOJ]3527 力(ZJOI2014)
    [Codeforces]906D Power Tower
    [BZOJ]1071 组队(SCOI2007)
  • 原文地址:https://www.cnblogs.com/EpisodeXI/p/4127274.html
Copyright © 2011-2022 走看看