P1132求二叉树的先序序列
描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。
格式
输入格式
第一行为二叉树的中序序列
第二行为二叉树的后序序列
输出格式
一行,为二叉树的先序序列
限制
每个测试点1s
来源
noip2001普及组第三题
思路
1)输入中序序列in,后序序列post2)中序序列按“左根右”遍历二叉树所得,后序序列按“左右根”遍历所得,故post的最后一个为树根ch
3)树根ch为后序序列post的最后一个字符,即ch=post[len-1],其中len为串长,即post.size()
4)样例中,由post找到根,然后由in分出左子树和右子树
in: BADC
post:BDCA
5)左子树为B,右子树为DC
6)先在in中找根的位置n=in.find(ch);
7)则左子树中序序列为in.substr(0,n),后序序列为post.substr(0,n)
8)右子树的先序序列为in.subst(n+1,len-n-1),后序序列为post.substr(n,len-n-1)
9)通过递归不断重复以后步骤,当串为空时退出
代码
#include <iostream>
using namespace std;
string in,post;
void tree(string sa,string sb)
{
int n,len=sb.size(); //求串长
char ch=sb[len-1]; //根据后序序列求出根
if(sb.empty()) return; //串为空时结束
cout<<ch; //前序遍历,先输出根
n=sa.find(ch); //找到根在中序序列中的位置
tree(sa.substr(0,n),sb.substr(0,n)); //根之前的为左子树,递归求左子树的根
tree(sa.substr(n+1,len-n-1),sb.substr(n,len-n-1)); //根之后的为右子树,递归求右子树的根
}
int main()
{
cin>>in>>post; //输入中序和后序序列
tree(in,post); //根据中序和后序输出中先序序列
return 0;
}