作者:C20180630_zjf
一、原题
根据两种遍历顺序确定树结构(build-tree)
输入
第1行:二叉树的前序遍历顺序
第2行:中序遍历顺序
输出
二叉树的后序遍历顺序
样例输入
ABCDEFGH
CBEDAGHF
样例输出
CEDBHGFA
二、分析
这道题要运用到搜索,其代码与二分查找比较相似,要先读入,然后把字符串分成两个部分进行下一步的递归,以便用二叉树的前序遍历和中序遍历来找到二叉树的后序遍历,并通过一层一层的递归将其输出。
三、源代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s1,s2;//定义字符串
void zjf(int l1,int r1,int l2,int r2){
int m=s2.find(s1[l1]);//找到s1字符串中的第l1的元素在s2里的位置
if(m>l2)//两种情况的列举与搜索
zjf(l1+1,l1+m-l2,l2,m-1);
if(m<r2)//两种情况的列举与搜索
zjf(l1+m-l2+1,r1,m+1,r2);
cout<<s1[l1];//输出答案
}
int main()
{
cin>>s1>>s2;
zjf(0,s1.length()-1,0,s2.length()-1);
//length代表s1,s2的长度
}
拓展
先序序列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。
输入
输入格式:第一行为二叉树的中序序列第二行为二叉树的后序序列
输出
输出格式:一行,为二叉树的先序序列
样例输入
BADC
BDCA
样例输出
ABCD
思路和上一题差不多,都是根据两种遍历顺序建树。
下面是源代码:
#include<cstdio>
#include<cstring>
using namespace std;
char a[10],b[10];
int n;
void zjf(int x,int y,int w,int z){
if(x>y) return;
int l;
for(int i=x;i<=y;i++)
if(a[i]==b[z]){l=i;break;}
printf("%c",a[l]);
zjf(x,l-1,w,w+l-1-x);
zjf(l+1,y,w+l-x,z-1);
}
int main()
{
scanf("%s%s",a,b);
n=strlen(a);
zjf(0,n-1,0,n-1);
}