算法训练 求先序排列
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入格式
两行,每行一个字符串,分别表示中序和后序排列
输出格式
一个字符串,表示所求先序排列
样例输入
BADC
BDCA
样例输出
ABCD
前言:虽然这是一道很基础的一道题,但是我看到一种优秀思路,我就想要记录到博客里。
思路与解析:
这是一个给中序和后序求先序的题,我们大概的思想就是在先序中找出和后序最后一个字符(头结点)一样的字符的位置,打印出来,然后他的左面就是左孩子,右面就是右孩子,然后再将左孩子的串递归进去,找根左右,没有左孩子了return回来找右孩子,在将右孩子串找左孩子,递归递归递归 递归……
1、比如我们拿例子中的
中序:BADC
后序:BDCA
首先在中序找到后序的最后一个字符 “A” , 找到他的下标是 1 ,并打印A,因为他是根,然后这时后序就剩DBC,中序分为了左子串“B”和右子串“DC”。
for(int i = 0;i < r1 ;i++) //遍历中序中节点
{
if(a[i] == b[r2 - 1]) //找到和末尾一样的字符
{
printf("%c",a[i]); //打印根
k = i; //记录下标
}
}
2、我们再先后把他的左子树和右子树递归进去
if( k > l1) tree(l1, k, l2, l2 + k - l1);
if(k + 1 < r1) tree(k+1, r1,l2 + k - l1,r2 -1);
k是根节点再中序串中的坐标,那么如果根节点的坐标不在中序串的第一个位置,即 k > l1 ,则代表他还有左孩子,那么就继续访问他的左孩子,那么左孩子的临界坐标应该是 l1和 k (这里为什么是k而不是k - 1,是因为在