晴问
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
using namespace std;
struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
TreeNode(int data) : data(data), left(nullptr), right(nullptr) {}
};
// 函数用于根据层序和中序遍历结果重建二叉树
TreeNode* buildTree(vector<int>& levelOrder, vector<int>& inOrder, int inStart, int inEnd, int levelStart, int levelEnd) {
if (inStart > inEnd) return nullptr;
TreeNode* root = new TreeNode(levelOrder[levelStart]);
int inRootIndex = inStart;
while (inOrder[inRootIndex] != levelOrder[levelStart]) {
inRootIndex++;
}
int leftTreeSize = inRootIndex - inStart;
root->left = buildTree(levelOrder, inOrder, inStart, inRootIndex - 1, levelStart + 1, levelStart + leftTreeSize);
root->right = buildTree(levelOrder, inOrder, inRootIndex + 1, inEnd, levelStart + leftTreeSize + 1, levelEnd);
return root;
}
// 先序遍历函数
void preOrder(TreeNode* root) {
if (root == nullptr) return;
cout << root->data << " ";
preOrder(root->left);
preOrder(root->right);
}
int main() {
int n;
cin >> n;
vector<int> levelOrder(n), inOrder(n);
for (int i = 0; i < n; ++i) {
cin >> levelOrder[i];
}
for (int i = 0; i < n; ++i) {
cin >> inOrder[i];
}
TreeNode* root = buildTree(levelOrder, inOrder, 0, n - 1, 0, n - 1);
preOrder(root);
return 0;
}