已知一个二叉树的中序遍历序列和后序遍历序列,求这棵树的前序遍历序列。 【输入形式】 一个树的中序遍历序列 该树后序遍历序列,中间用空格分开。输入序列中仅含有小写字母,且没有重复的字母 【输出形式】 一个树的前序遍历序列C语言
时间: 2023-07-24 09:11:01 浏览: 104
以下是 C++ 代码,可以参考:
```cpp
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
unordered_map<char, int> umap;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* buildTree(vector<char>& inorder, vector<char>& postorder, int in_left, int in_right, int post_left, int post_right) {
if (in_left > in_right || post_left > post_right) {
return NULL;
}
char root_val = postorder[post_right];
int in_root_idx = umap[root_val];
TreeNode* root = new TreeNode(root_val);
int left_len = in_root_idx - in_left;
root->left = buildTree(inorder, postorder, in_left, in_root_idx - 1, post_left, post_left + left_len - 1);
root->right = buildTree(inorder, postorder, in_root_idx + 1, in_right, post_left + left_len, post_right - 1);
return root;
}
void preorder(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val << " ";
preorder(root->left);
preorder(root->right);
}
int main() {
vector<char> inorder, postorder;
char val;
while (cin >> val) {
inorder.push_back(val);
}
while (cin >> val) {
postorder.push_back(val);
}
int n = inorder.size();
for (int i = 0; i < n; i++) {
umap[inorder[i]] = i;
}
TreeNode* root = buildTree(inorder, postorder, 0, n - 1, 0, n - 1);
preorder(root);
return 0;
}
```
其中,`buildTree` 函数用于构建二叉树,`preorder` 函数用于输出前序遍历序列。
阅读全文