作者: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);
}