(一道dfs的小水题)
前段时间校内集训的时候
学长还曾抛出过这个问题
然而我又咕掉了
(期中之后准备洗心革面的我决心从dfs开始复(学)习
(卑微
----------------------------------------------------------------------------------------
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8 le 8≤8)。
输入输出格式
输入格式:2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式:
1行,表示一棵二叉树的先序。
输入输出样例
输入样例#1:
BADC
BDCA
输出样例#1:
ABCD
----------------------------------------------------------------------------------------
先序遍历
根-->左子树-->右子树
中序遍历
左子树-->根-->右子树
后序遍历
左子树-->右子树-->根
层次遍历
仅仅需按层次遍历就可以
前序遍历:1 2 4 5 7 8 3 6
中序遍历:4 2 7 5 8 1 3 6
后序遍历:4 7 8 5 2 6 3 1
层次遍历:1 2 3 4 5 6 7 8
-----------------------------------------------------------------------------------------------
由于后序遍历最后遍历到根的特点
所以后序遍历的最后一个点一定是根节点
由此在中序遍历的序列中
找到根节点
就可以把中序遍历分成两部分:左子树和右子书
递归下去就可以
-------------------------------------------------------------------------------------------------
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char a[10],b[10];
int len;
void dfs(int l,int r,int ll,int rr)//后序遍历区间l,r;中序遍历区间ll,rr
{
if(l == r)
{
cout<<b[r];
return;
}
if(l > r)
return;
cout<<b[r];
int cnt = 0,mrk;
for(int i = ll;i <= rr;i++)
{
if(a[i] == b[r])
{
mrk = i;
break;
}
else
cnt++;
}
dfs(l,l+cnt-1,ll,mrk - 1);
dfs(l+cnt,r - 1,mrk+1,rr);
}
int main()
{
scanf("%s",a);
scanf("%s",b);
len = strlen(a);
dfs(0,len - 1,0,len - 1);
return 0;
}