室友在做于是也做一发,跟已知两种遍历序列还原二叉树的思路类似,感觉PAT上的题目跟书本知识靠的近一些
#include <iostream> #include <cstdio> #include <vector> using namespace std; void print_data(const vector<char> &as, const vector<int> &ns) { int len = ns.size(); for (int i=0; i<len; i++) { if (as[i] == 'i') { cout<<"push "<<ns[i]<<endl; } else { cout<<"pop"<<endl; } } } void build_postorder(vector<char> &actions, vector<int> &nums, int start, int end, vector<int> &postorder) { if (start >= end) return; if (actions[start] != 'i') return; // root node postorder.push_back(nums[start]); // now try to find the seperator idx of // action(must be a pop pair wise with root node push) between two sub tree int pushs = 1; int idx = start + 1; while (pushs != 0 && idx < end) { if (actions[idx] == 'i') { pushs++; } else { pushs--; } idx++; } // right sub tree build_postorder(actions, nums, idx, end, postorder); // left sub tree build_postorder(actions, nums, start + 1, idx, postorder); } int main() { int N, len; scanf("%d", &N); len = N * 2; char buf[10]; int num; vector<char> actions(2 * N, '