已知二叉树的先序遍历和中序遍历,输出它的后序遍历_数组


 

#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>
using namespace std;

unordered_map<int, int>record;
vector<char>res;
//先序遍历数组,中序遍历数组,当前处理的先序遍历数组的开始索引,当前处理的先序遍历数组的结束索引,当前处理的中序遍历数组的开始索引,当前处理的中序遍历数组的结束索引,
//先序遍历数组,中序遍历数组,
void my_buildTree(vector<char>& preorder, vector<char>& inorder, int pre_left, int pre_right, int in_left, int in_right)
{
//当前遍历的先序数组,元素已经没有了,返回空
if (pre_left>pre_right)return;
// 在中序遍历中定位根节点
int root_index = record[preorder[pre_left]];

//创建一个根节点


//左子树的个数
int left_tree = root_index - in_left;
//构建左子树
my_buildTree(preorder, inorder,
pre_left + 1,
pre_left + left_tree,
in_left,
root_index - 1);
//构建右子树
my_buildTree(preorder, inorder,
pre_left + left_tree + 1,
pre_right,
root_index + 1,
in_right);
res.push_back(inorder[root_index]);
}
int main()
{
string pre;
string in;
cin >> pre >> in;
vector<char> preorder;
vector<char> inorder;
for (int i = 0; i<pre.size(); i++)
{
preorder.push_back(pre[i]);
inorder.push_back(in[i]);
}
int n = inorder.size();

//res.resize(n);
for (int i = 0; i < n; i++)
{
record[inorder[i]] = i;
}
my_buildTree(preorder, inorder, 0, n - 1, 0, n - 1);

for (int i = 0; i<res.size(); i++)
cout << res[i]<<" ";
cout << endl;

}