1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #include<stdio.h> #include<vector> #include<map> #include<algorithm> #include <algorithm> #include <iostream> #include<string> using namespace std;
vector<int> InOrder, LevelOrder; vector<int>ans; vector<int>ans1,ans2; void getPreOder(int l1, int r1, int l2, int r2) { int i, j; //l1,r1_inorder //l2,r2_levelorder //在中序中找到层序遍历当前的根节点 for(i = l2; i <= r2; i++) { bool flag = false; for(j = l1; j <= r1; j++) { if(LevelOrder[i] == InOrder[j]) { // cout << LevelOrder[i]<<" "; ans1.push_back(LevelOrder[i]); flag = true; break; } } if(flag) break; } bool flag=false; if(j > l1) {getPreOder(l1, j - 1, 0, r2);flag=true;} if(j < r1) {getPreOder(j + 1, r1, 0, r2);flag=true;} if(!flag)ans.push_back(LevelOrder[i]); }
// 递归构造后序遍历字符串 void getPostOrder(int l1, int r1, int l2, int r2) { int i, j; for(i = l2; i <= r2; i++) { bool flag = false; // 在中序遍历中找到当前层次遍历结点对应的位置 for(j = l1; j <= r1; j++) { if(LevelOrder[i] == InOrder[j]) { flag = true; break; } } if(flag) break; } // cerr<<InOrder[j]<<endl; // 递归处理左子树 if(j > l1) getPostOrder(l1, j - 1, 0, r2); // 递归处理右子树 if(j < r1) getPostOrder(j + 1, r1, 0, r2); // 输出当前根节点的值 ans2.push_back(InOrder[j]); //cout << InOrder[j]<<" "; }
int main() { int n; cin>>n; // 读入层次遍历的字符串 for(int i=0;i<n;i++){ int x;cin>>x; LevelOrder.push_back(x); } //中序遍历 for(int i=0;i<n;i++){ int x;cin>>x; InOrder.push_back(x); } // 调用 getPostOrder 函数并传入整棵树的中序遍历区间和层次遍历区间 getPreOder(0, InOrder.size() - 1, 0, LevelOrder.size() - 1); //cout<<endl; getPostOrder(0, InOrder.size() - 1, 0, LevelOrder.size() - 1); //cout<<endl; for(auto x:ans)cout<<x<<" ";cout<<endl; for(auto x:ans1)cout<<x<<" ";cout<<endl; for(auto x:ans2)cout<<x<<" ";cout<<endl; return 0; }
|