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
| #include <iostream> #include <vector> #include <unordered_map> #include <sstream>
struct TreeNode { int val; TreeNode* left; TreeNode* right;
TreeNode(int v) : val(v), left(nullptr), right(nullptr) {} };
TreeNode* buildTree(const std::vector<int>& inorder, const std::vector<int>& postorder, int inStart, int inEnd, int postStart, int postEnd, std::unordered_map<int, int>& indexMap) { if (inStart > inEnd || postStart > postEnd) { return nullptr; }
int rootVal = postorder[postEnd]; TreeNode* root = new TreeNode(rootVal);
int rootIndex = indexMap[rootVal];
int leftTreeSize = rootIndex - inStart; int rightTreeSize = inEnd - rootIndex;
root->left = buildTree(inorder, postorder, inStart, rootIndex - 1, postStart, postStart + leftTreeSize - 1, indexMap); root->right = buildTree(inorder, postorder, rootIndex + 1, inEnd, postEnd - rightTreeSize, postEnd - 1, indexMap);
return root; }
void inorderTraversal(TreeNode* root, std::vector<int>& inorderSequence) { if (root == nullptr) { return; }
inorderTraversal(root->left, inorderSequence); inorderSequence.push_back(root->val); inorderTraversal(root->right, inorderSequence); }
int main() { int N; std::cin >> N;
std::vector<int> preorder(N); std::vector<int> postorder(N);
for (int i = 0; i < N; ++i) { std::cin >> preorder[i]; }
for (int i = 0; i < N; ++i) { std::cin >> postorder[i]; }
std::unordered_map<int, int> indexMap;
for (int i = 0; i < N; ++i) { indexMap[preorder[i]] = i; }
TreeNode* root = buildTree(preorder, postorder, 0, N - 1, 0, N - 1, indexMap);
std::vector<int> inorderSequence; inorderTraversal(root, inorderSequence);
std::cout << "Yes" << std::endl; for (int i = 0; i < inorderSequence.size(); ++i) { std::cout << inorderSequence[i]; if (i != inorderSequence.size() - 1) { std::cout << " "; } } std::cout << std::endl;
return 0; }
|