此题涉及到的<unordered_map>所建立的哈希表,没有多复杂,但对构造树方面确是很方便,
有时候掌握一些这样的额外知识,对编程大有帮助,例如vector容器,string类型等等。千里之行,始于足下。不停积累编程会更上一层楼
std::unordered_map<int,int>indexMap;
#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
//节点结构体
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char val) :val(val), left(nullptr), right(nullptr) {}
};
// 递归构造二叉树
TreeNode* buildTreeRecursive(string& preorder, string& inorder, int preStart, int inStart, int inEnd, unordered_map<int, int>& indexMap)
{
if (preStart > preorder.size() - 1 || inStart > inEnd)
{
return nullptr;
}
//根据前序遍历的结果获得当前子树的根节点值
char rootValue = preorder[preStart];
TreeNode* root = new TreeNode(rootValue);
//根据中序遍历结果获取当前子树的根节点在中序遍历的索引
int rootIndex = indexMap[rootValue];
//递归构造左子树和右子树
root->left = buildTreeRecursive(preorder, inorder, preStart + 1, inStart, rootIndex - 1, indexMap);
root->right = buildTreeRecursive(preorder, inorder, preStart + rootIndex - inStart + 1, rootIndex + 1, inEnd, indexMap);
return root;//左递归建立完成后,进行右递归,右递归完成后,一步步回退,最后root就是整棵树的根节点
}
//建立哈希表,调用建树函数
TreeNode* builTree(string& preorder, string& inorder)
{
//创建一个哈希表,用于快速查找中序遍历结果中节点值对应的索引
std::unordered_map<int, int>indexMap;
for (int i = 0; i < inorder.size(); ++i)
{
indexMap[inorder[i]] = i;//inedx[i]为字符串类型,隐式转换为整数类型
}
// 递归构造二叉树
return buildTreeRecursive(preorder, inorder, 0, 0, inorder.size() - 1, indexMap);
}
//后序遍历二叉树
void postorderTraversal(TreeNode* root)
{
if (root == nullptr)
return;
postorderTraversal(root->left);//这里的递归需要自己对照简单案例模拟一下
postorderTraversal(root->right);//在确定当前节点的左子树和右子树已经全部访问完了,才可以访问当前节点
cout << root->val;
}
int main()
{
string s;
while (getline(cin, s))
{
string preorder = "", inorder = "";
int i;
for (i = 0; s[i] != ' '; i++)//这么做是因为分开前序和中序字符串
{
preorder += s[i];
}
i++;
for (; i < s.size();i++)
{
inorder += s[i];
}
TreeNode* root = builTree(preorder, inorder);//返回根节点
postorderTraversal(root);
cout << endl;
}
return 0;
}