https://www.luogu.org/problemnew/show/P1030
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8 \le 8≤8)。
输入输出格式
输入格式:
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式:
1行,表示一棵二叉树的先序。
输入输出样例
输入样例#1: 复制
BADC BDCA
输出样例#1: 复制
ABCD
思路:紫书经典例题,刚入门的话确实有点难度,不过熟悉理解树后就简单了。中序遍历:左根右;后序遍历:左右根;那么后序遍历区间右端点下标对应的值必定是根结点的值,有了根结点的值就可以在中序遍历中找到根的位置,从而知道左子树的结点个数和右子树的结点个数,那么就可以确定左子树(右子树)中序、后序的区间,递归的访问下去。因为这道题输出的是数的先序,那么就先输出根结点的值再访问左、右子树。
#include<iostream>
using namespace std;
string s1,s2;
void PreOrder(int l1,int r1,int l2,int r2);//中序遍历区间左右端点 后序遍历区间左右端点
int main()
{
cin>>s1>>s2;
PreOrder(0,s1.size()-1,0,s2.size()-1);
return 0;
}
void PreOrder(int l1,int r1,int l2,int r2)//左根右 左右根
{
if(l1<=r1&&l2<=r2)
{
char root=s2[r2]; //根节点
int i=0;
for(;i<=r1-l1;i++)
if(s1[l1+i]==root)
break;
cout<<root; //输出根的值
PreOrder(l1,l1+i-1,l2,l2+i-1);
PreOrder(l1+i+1,r1,l2+i,r2-1);
}
}