【题目链接】
【题目描述】
输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
【输入】
共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。
【输出】
一行,表示树的后序遍历序列。
【输入样例】
abdec
dbeac
【输出样例】
debca
【题解】
#include <iostream>
#include <string>
using namespace std;
struct TreeNode{
char val;
TreeNode *left,*right;
TreeNode(char c):val(c),left(nullptr),right(nullptr){
}
};
//根据先序、中序进行创建二叉树
TreeNode *build(string preorder,string inorder){
if(preorder.empty()||inorder.empty()){
return nullptr;
}
char c = preorder[0];
TreeNode *root = new TreeNode(c);//创建根节点
int pos = inorder.find(c);
//截取中序左子树
string inLeft = inorder.substr(0,pos);
//根据中序左子树长度进行截取先序左子树
string preLeft = preorder.substr(1,inLeft.size());
//进行左子树遍历
root->left = build(preLeft,inLeft);
//同理对右子树进行操作
string inRight = inorder.substr(pos+1);
string preRight = preorder.substr(inLeft.size()+1);
root->right = build(preRight,inRight);
return root;
}
void postorderTraversal(TreeNode *root){
if(root!= nullptr){
postorderTraversal(root->left);
postorderTraversal(root->right);
cout<<root->val;
}
}
int main(){
string n,m;
cin>>n>>m;
TreeNode *root = build(n,m);
postorderTraversal(root);
}