算法训练 求先序排列(递归 ,蓝桥杯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,是因为在

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值