输入一棵树的先序遍历和中序遍历,输出后序遍历序列。
已知中序和后续 推前序,可以看我的另一个文章
https://blog.csdn.net/Inuyasha__/article/details/99756631
要点:
- 中序遍历是 树的左子树 + 树的根节点 + 树的右子树
- 前序序遍历是 树的根节点 + 树的左子树 + 树的右子树
- 换句话来说,有了前序遍历就有了根,有了根通过中序遍历,就有了左右子树,根据长度选出后续遍历的左右子树,然后这个选出来的左右子树最有变又是根,然后又去中序遍历找…………这是一个递归的过程
#include<bits/stdc++.h>
using namespace std;
struct Node {
char ch;
Node *left, *right;
};
string pre, in;
Node* createNode(int preL, int preR, int inL, int inR) {
if (preL > preR) return NULL;
Node* root = new Node();
char ch = pre[preL];
root->ch = ch;
int i;
for (i = inL; i <= inR; i++) {
if (ch == in[i])
break;
}
int cnt = i - inL;
root->left = createNode(preL + 1, preL + cnt, inL, i - 1);
root->right = createNode(preL + cnt + 1, preR, i + 1, inR);
return root;
}
void postOrder(Node* root) {
if (root == NULL) return;
postOrder(root->left);
postOrder(root->right);
cout << root->ch;
}
int main() {
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while (cin >> pre >> in) {
Node* root = createNode(0, pre.size() - 1, 0, in.size() - 1);
postOrder(root);
cout << endl;
}
return 0;
}