P1030 求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\le 8≤8)。
输入格式
22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
11行,表示一棵二叉树的先序。
输入输出样例
输入 #1
BADC
BDCA
输出 #1
ABCD
思路图
我的代码
#include<iostream>
using namespace std;
string a, m;// a串是后序排列, m串是中序排列
int lena, lenm;// lena是a串长度,lenm是m串长度。
void solve(int as, int ae, int ms, int me) {
/*
as: a串起点, ae:a串终点(a[ae]也是可访问的)
ms;m串起点, me:m串终点(m[me]也是可访问的)
*/
char root = a[ae];// a串最右边的必为根节点
cout << root; // 直接输出根节点:这里想到了写先序、中序等二叉树遍历算法时的做法
int rootInM = -1; // 在 m串中找到根节点:m串根节点左边的为左子树,右边的为右子树
for (int i = ms; i <= me; i++) {
if (m[i] == root) {
rootInM = i;
break;
}
}
int leftLen = rootInM - ms, rightLen = me - rootInM; // 确定左右子树长度,如果为0则后续不再递归处理
if (leftLen > 0) solve(as, as + leftLen - 1, ms, rootInM - 1); // 递归处理左子树
if (rightLen > 0) solve(as + leftLen, ae - 1, rootInM + 1, me); // 递归处理右子树
}
int main() {
cin >> m >> a;
lena = a.size();
lenm = m.size();
solve(0, lena - 1, 0, lenm - 1);
return 0;
}