题目
树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。
假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。
输入格式
两行,每行是由大写字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。
输出格式
一行,表示二叉树的先序序列。
数据范围
输入字符串的长度均不超过26。
输入样例:
DBEAC
ABCDE
输出样例:
ABDEC
解题思路
- 层次遍历的特点,依次遍历一定是根节点在前面的 所有是会找到根节点的。
- 所以外面可以依次遍历层次序列 拿到根节点 然后直接输出根结点 再中序中判断当前节点是否还含有左右子树,就先递归左子树 然后递归右子树,就这样递归下去就可得到答案
- 回到上一个问题, 为什么?直接拿到中序的节点就要输出呢 ?然后左右次序递归呢?————这是根据先序次序得来的。 先序就是——根左右;
- 我们拿到当前根节点了,就去递归左子树,左子树递归完了,再去寻找右子树。
代码
#include<iostream>
using namespace std;
string s1,s2;
void DFS(int L1,int R1,int L2,int R2)
{
int i,j;//因为要传入参 所有要在循环外面定义;
for(i=L2;i<=R2;i++)//层次 依次枚举
{ bool f=false;
for(j=L1;j<=R1;j++)//中序 找到和层次相等的字符
{
if(s1[j]==s2[i])//在中序中找到层次相对相应的字符;
{
cout<< s2[i];
f=true;
break;//找到就退出 寻找下一位;
}
}
if(f)break;// 找到了一位就退出了,寻找下一位
}
if(j>L1)DFS(L1,j-1,L2,R2);//中序 左区间还有字符
if(j<R2)DFS(j+1,R1,L2,R2);// 中序 右区间还有字符
}
int main()
{
cin>> s1>> s2;//中序 层次;
DFS(0,s1.length()-1,0,s2.length()-1);
return 0;
}