1127 ZigZagging on a Tree (30分)

    技术2024-10-13  49

    根据两个遍历建树,把同一深度的节点从左到右存入一个vector,然后根据题意输出。

    #include<iostream> #include<stdio.h> #include<stdlib.h> #include<map> #include<string> #include<math.h> #include<stack> #include<algorithm> #include<queue> using namespace std; int N; int in[50], post[50]; vector<int> ls[50];//每一层的节点(从左到右 void solve(int l1, int r1, int l2, int r2, int depth) { if (l1 > r1) return; int rt = post[r2]; ls[depth].push_back(rt); int pos = l1; while (in[pos] != rt) ++pos; solve(l1, pos - 1, l2, l2 + pos - l1 - 1, depth + 1); solve(pos + 1, r1, l2 + pos - l1, r2 - 1, depth + 1); } int main() { #ifdef LIU FILE *ss; freopen_s(&ss, "1.txt", "r", stdin); #endif cin >> N; for (int i = 0; i < N; i++)cin >> in[i]; for (int i = 0; i < N; i++)cin >> post[i]; solve(0, N - 1, 0, N - 1, 0); cout << ls[0][0];//根 int l=1; while (ls[l].size() > 0) { if (l%2) {//l是奇数,从左到右 for (int i = 0; i < ls[l].size(); i++) cout << ' ' << ls[l][i]; } else {//从右向左输出 for (int i = ls[l].size() - 1; i >= 0; i--) cout << ' ' << ls[l][i]; } l++; } cout << endl; return 0; }
    Processed: 0.013, SQL: 9