P1030求先序排列
阿新 • • 發佈:2018-11-23
。。 pan class 後序 二叉樹 格式 targe -o 組成
復制
這道題很重點啊。。。
首先是對樹的理解,了解先序、中序、後序的排列
再自己找出排列的規律。
初學樹狀結構做這道題能加深自己的理解。
以及判定範圍。。。40分慘痛教訓。。。
傳送門
題目描述
給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不同的大寫字母表示,長度≤8 \le 8≤8)。
輸入輸出格式
輸入格式:222行,均為大寫字母組成的字符串,表示一棵二叉樹的中序與後序排列。
輸出格式:111行,表示一棵二叉樹的先序。
輸入輸出樣例
輸入樣例#1: 復制BADC BDCA輸出樣例#1:
ABCD
上代碼:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
template <typename T>inline void read(T &a)
{
bool f=0;char ch=getchar();a=0;
while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=1;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){a=a*10+ch-‘0‘;ch=getchar();}
if(f==1)a=-a;
}//好習慣,雖然沒用上。
char l[9],m[9];
int s;
void find(int ll,int lr,int ml,int mr)
{
cout<<l[lr];
if(ll==lr)
return;
int root;
for (int i=ml;i<=mr;i++)
if(m[i]==l[lr])
{
root=i;
break;
}
if(root>ml)//判範圍!!!判範圍!!
find(ll,ll+root-ml-1,ml,root-1);
if(root<mr)//判範圍!!!判範圍!!
find(ll+root-ml,lr-1,root+1,mr);
}
int main(){
scanf("%s",m);
scanf("%s",l);
s=strlen(l);
find(0,s-1,0,s-1);
return 0;
}
P1030求先序排列