算法训练 求先序排列(递归 ,蓝桥杯C++,简洁算法、代码)

算法训练 求先序排列

资源限制
时间限制: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,是因为在

你可能感兴趣的:(蓝桥杯,算法,字符串,二叉树,数据结构)