晴问 通过中序遍历判断左右子树,接着从层序遍历中,把左子树的层序遍历和右子树的层序遍历提取出来
cpp
#include <bits/stdc++.h>
using namespace std;
vector<int> in, cc;
struct treeNode {
int data;
treeNode *left;
treeNode *right;
treeNode(int data) : data(data), left(nullptr), right(nullptr) {}
};
treeNode *dfs(treeNode *&root, vector<int> &level, int in_left, int in_right) {
if (level.size() == 0) return nullptr;
int curRootNum = level[0], rootInIndex;
for (rootInIndex = in_left; rootInIndex <= in_right; ++rootInIndex) {
if (in[rootInIndex] == curRootNum) break;
}
root = new treeNode(curRootNum);
set<int> leftTree;
for (int i = in_left; i < rootInIndex; ++i) {
leftTree.insert(in[i]);
}
vector<int> level_left, level_right;
for (int i = 0; i < level.size(); ++i) {
if (level[i] == curRootNum) continue;
if (leftTree.find(level[i]) != leftTree.end()) {
level_left.push_back(level[i]);
} else {
level_right.push_back(level[i]);
}
}
dfs(root->left, level_left, in_left, rootInIndex - 1);
dfs(root->right, level_right, rootInIndex + 1, in_right);
return root;
}
vector<int> result;
void preOrder(treeNode *root) {
if (root == nullptr) return;
result.push_back(root->data);
preOrder(root->left);
preOrder(root->right);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int num;
cin >> num;
cc.push_back(num);
}
for (int i = 0; i < n; ++i) {
int num;
cin >> num;
in.push_back(num);
}
treeNode *root;
dfs(root, cc, 0, n - 1);
preOrder(root);
for (int i = 0; i < result.size(); ++i) {
cout << result[i];
if (i != result.size() - 1) cout << " ";
}
return 0;
}