后续遍历最后一个节点即为根节点;中序编译根节点又将二叉树分为左右两颗二叉树
后序遍历(左孩子->右孩子->父节点)
中序遍历(左孩子->父节点->右孩子)
typedef struct node{
char val;
struct node *left;
struct node *right;
}Node;
Node *buildTree(vector<char>&post,vector<char>middle)
{
if(post.size() != middle.size() || middle.empty())
{
return nullptr;
}
char ch = post[post.size() -1];
Node* root = new Node();
root->val = ch;
root->left = nullptr;
root->right = nullptr;
// 构建左子树
vector<char> leftMiddleNodes;
vector<char> leftPostNodes;
set<char>setLeft;
int index = 0;
for(; index < middle.size(); ++index)
{
if(middle[index] == ch)
{
index ++;
break;
}
leftMiddleNodes.push_back(middle[index]);
setLeft.insert(middle[index]);
}
for(auto &ch : post)
{
if(setLeft.find() != setLeft.end())
{
leftPostNodes.push_back(ch);
}
}
root->left = buildTree(leftPostNodes,leftMiddleNodes);
// 构建右子树
vector<char> rightMiddleNodes;
vector<char> rightPostNodes;
set<char>setright;
for(; index < middle.size(); ++index)
{
rightMiddleNodes.push_back(middle[index]);
setright.insert(middle[index]);
}
for(auto &ch : post)
{
if(setright.find() != setright.end())
{
rightPostNodes.push_back(ch);
}
}
root->right = buildTree(rightPostNodes,rightMiddleNodes);
return root;
}