#include<iostream>
#include<cstring>
using namespace std;
void tree(string s1, string s2)
{
int len1=s1.size();
int len2=s2.size();
if(len1>0){
char ch=s2[len2-1]; //根节点
cout<<ch; //每次递归输出根节点
int pos=s1.find(ch); //在s1中找到ch出现的位置
tree(s1.substr(0,pos),s2.substr(0,pos)); //递归左子树
tree(s1.substr(pos+1),s2.substr(pos,len1-pos-1)); //递归右子树
}
}
int main()
{
string a, b; cin >> a >> b;
tree(a, b);
}
上面是题解代码
一. 思路
通过递归遍历左子树和右子树并直接输出根节点
二. 细节
因为先序遍历是递归输出左子树和右子树的根节点。所以我们只需要找到左子树,右子树的根节点,并且直接将其输出就可以。
我们知道后序的最后一个节点是根节点。也就是说中序遍历里面它的左边和右边分别是它的两棵子树。并且有一个很有趣的结论: 设中序遍历的字符串从开头到根结点的距离为n。对应的后续遍历的前n个字母, 他们就是根节点的左子树的后续遍历。大家可以尝试自行推导一下右子树。
基于以上两点,我们可以递归的完成这个题目。
三. 补充
用到了STL库中的 substr() ,
函数语法
SUBSTR (str, pos)
截取从pos位置开始到最后的所有str字符串
SUBSTR (str, pos, len)
参数说明:
- str为列名/字符串;
- pos为起始位置;mysql中的起始位置pos是从1开始的;如果为正数,就表示从正数的位置往下截取字符串(起始坐标从1开始),反之如果起始位置pos为负数,那么 表示就从倒数第几个开始截取;
- len为截取字符个数/长度。