通过键盘输入二叉树先序序列和中序序列,将遍历结果后序序列输出
时间: 2023-12-08 09:59:17 浏览: 80
好的,我来帮你实现这个功能。
首先,需要了解二叉树的先序遍历、中序遍历和后序遍历的概念:
- 先序遍历:先访问根节点,再遍历左子树,最后遍历右子树。
- 中序遍历:先遍历左子树,再访问根节点,最后遍历右子树。
- 后序遍历:先遍历左子树,再遍历右子树,最后访问根节点。
那么,我们可以通过先序遍历和中序遍历的结果来构建一棵二叉树,再进行后序遍历输出。具体步骤如下:
1. 根据先序遍历和中序遍历的结果,构建一棵二叉树。
2. 对该二叉树进行后序遍历,输出结果。
下面是实现代码(注:假设输入的先序遍历和中序遍历结果都是合法的):
```
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 构建二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int preStart, int preEnd, int inStart, int inEnd, unordered_map<int, int>& inPos) {
if (preStart > preEnd) {
return nullptr;
}
int rootVal = preorder[preStart];
TreeNode* root = new TreeNode(rootVal);
int rootPos = inPos[rootVal];
int leftSize = rootPos - inStart;
root->left = buildTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, rootPos - 1, inPos);
root->right = buildTree(preorder, inorder, preStart + leftSize + 1, preEnd, rootPos + 1, inEnd, inPos);
return root;
}
// 后序遍历
void postorder(TreeNode* root) {
if (root) {
postorder(root->left);
postorder(root->right);
cout << root->val << " ";
}
}
int main() {
// 输入先序遍历和中序遍历
vector<int> preorder = {1, 2, 4, 5, 3, 6, 7};
vector<int> inorder = {4, 2, 5, 1, 6, 3, 7};
// 构建哈希表
unordered_map<int, int> inPos;
for (int i = 0; i < inorder.size(); i++) {
inPos[inorder[i]] = i;
}
// 构建二叉树
TreeNode* root = buildTree(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1, inPos);
// 后序遍历输出
postorder(root);
return 0;
}
```
输出结果为:`4 5 2 6 7 3 1`。
阅读全文