描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。
格式
输入格式
第一行为二叉树的中序序列
第二行为二叉树的后序序列
输出格式
一行,为二叉树的先序序列
样例1
样例输入1
BADC
BDCA
样例输出1
ABCD
限制
每个测试点1s
来源
noip2001普及组第三题
<br/ >
<br/ >
解析:根据中序序列和后续序列构造出这棵二叉树,再先序遍历即可。
#include <iostream>
#include <string>
using namespace std;
string s1, s2;
struct Node{
char val;
Node *l , *r;
Node(){
l = NULL;
r = NULL;
}
};
Node* build(const string& s1, const string& s2)
{
Node *root = new Node();
root->val = *(s2.end()-1);
size_t pos = s1.find(root->val);
if(pos != 0){
string left_s1 = s1.substr(0, pos);
string left_s2 = s2.substr(0, pos);
root->l = build(left_s1, left_s2);
}
if(pos != s1.length()-1){
string right_s1 = s1.substr(pos+1);
string right_s2 = s2.substr(pos, s2.length()-1-pos);
root->r = build(right_s1, right_s2);
}
return root;
}
void pre_order(Node *root)
{
if(root != NULL){
cout<<root->val;
pre_order(root->l);
pre_order(root->r);
}
}
void destroy(Node *root)
{
if(root->l != NULL)
destroy(root->l);
if(root->r != NULL)
destroy(root->r);
delete root;
}
int main()
{
cin>>s1>>s2;
Node *root = build(s1, s2);
pre_order(root);
destroy(root);
return 0;
}