#include #include using namespace std;

// 判断是否为二叉搜索树或其镜像的前序遍历结果 bool isPreorder(vector& preorder, int start, int end) { if (start >= end) { return true; } int root = preorder[start]; int i; for (i = start + 1; i <= end; i++) { if (preorder[i] >= root) { break; } } int j; for (j = i; j <= end; j++) { if (preorder[j] < root) { return false; } } return isPreorder(preorder, start + 1, i - 1) && isPreorder(preorder, i, end); }

// 获取二叉搜索树的后序遍历结果 void getPostorder(vector& preorder, int start, int end, vector& postorder) { if (start > end) { return; } int root = preorder[start]; int i; for (i = start + 1; i <= end; i++) { if (preorder[i] >= root) { break; } } getPostorder(preorder, start + 1, i - 1, postorder); getPostorder(preorder, i, end, postorder); postorder.push_back(root); }

int main() { int N; cin >> N; vector preorder(N); for (int i = 0; i < N; i++) { cin >> preorder[i]; } if (isPreorder(preorder, 0, N - 1)) { cout << 'YES' << endl; vector postorder; getPostorder(preorder, 0, N - 1, postorder); for (int i = 0; i < N; i++) { cout << postorder[i]; if (i < N - 1) { cout << ' '; } } } else { cout << 'NO'; } return 0; }


原文地址: https://www.cveoy.top/t/topic/o04e 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录