-
首先, 对于先序, 中序, 后序遍历的区别: 其实就是对于根节点的访问顺序不同而已, 先访问根节点即先序, 先左子树再根再右子树即中序, 先左子树再右子树最后根节点即后序访问.
-
由上面的定义我们不难得到结论: 后序遍历的最后一个就是根节点.
-
敲重点: 由上面的那个重要结论我们可以先由后序序列找到根节点, 然后根据这个根节点来对中序以及后序序列进行分割, 于是可以得到左右子树, 然后对左子树以及右子树进行递归地处理.
-
就按这样一直做下去(先输出根,再递归); 模板概括为
step1:找到根并输出
step2:将中序,后序各分为左右两棵子树;
step3:递归,重复step1,2;
#include <bits/stdc++.h>
using namespace std;
void solve (string mid, string after) {
if (after.size() > 0) {
char ch;
ch = after[after.size() - 1];
cout << ch;
int k = mid.find(ch);
//这里特别注意一下: after.substr(k,in.size()-k-1))是因为substr(下标,你想取的长度),比如string a = "1234567",a.substr(2,3)="345"
solve(mid.substr(0, k), after.substr(0, k));
solve(mid.substr(k + 1), after.substr(k, mid.size() - k - 1));
}
}
int main() {
string midStr, afterStr;
cin >> midStr >> afterStr;
solve(midStr, afterStr);
return 0;
}
复制代码