题目:已知二叉树先序遍历+中序遍历 求后序遍历
对于一棵二叉树,给定其先序遍历的结果序列和中序遍历的结果序列,请写出其后序遍历的结果序列。
输入样例:
GDAFEMHZ(先序遍历的结果序列)
ADEFGHMZ(中序遍历的结果序列)
输出样例:
AEFDHZMG(后序遍历的结果序列)
思路分析👇
- 因为前序遍历的首个元素即为根节点,且在中序遍历中根节点前的元素位于左子树,根节点后的元素位于右子树。
- 利用这一性质,可以把问题看成一个递归问题
- 递归过程是从前序遍历结果中找到中序遍历时根节点前的元素,构成了根的左子树的前序遍历结果,将二者作为参数再传入函数;再从前序遍历结果中找到中序遍历时根节点后的元素,构成了根的右子树的前序遍历结果,将二者作为参数再传入函数
- 题目要求后序遍历的顺序输出,所以最后再输出根节点的元素值
代码示例👇
//author:Mitchell_Donovan
//date:4.25
#include<iostream>
using namespace std;
void run(string A, string B);
int main() {
string pre;
cout << "请输入后序遍历结果:";
cin >> pre;
string in;
cout << "请输入中序遍历结果:";
cin >> in;
cout << "后序遍历结果:";
run(pre, in);
}
void run(string A, string B) {
if (B.length() == 0) {
return;
}
if (B.length() == 1) {
cout << A.front();
return;
}
//substr(0,x)左闭右开
//substr(x,y)左闭右闭
//substr(x)左闭右末尾
run(A.substr(1, B.find(A.front())), B.substr(0, B.find(A.front())));
run(A.substr(B.find(A.front()) + 1), B.substr(B.find(A.front()) + 1));
//根据后序遍历的顺序,最后再输出根节点的元素值
cout << A.front();
}
输出示例👇
补充内容
👉substr(0,x)左闭右开
👉substr(x,y)左闭右闭
👉substr(x)左闭右末尾