已知二叉树的前序遍历、中序遍历,输出其后序遍历。
例如:
思路:
- 前序的第一个字符,是树根root,也是中序的中间字符,分割左右子树的中序;
- 中序左右子树长度,得到前序左右子树;
- 递归左/右的前序+中序
原来: 前序 DBE|==A==|CF、中序 ==A==|BDE|FC
A 左: 前序 ==D==|B|E、中序 B|==D==|E
A 右: 前序 ==C==|F、中序 F|==C==
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <iostream> #include <cstring> using namespace std;
struct Node { Node *left = NULL, *right = NULL; char data = '?';
void LRD_Print() { if (left) left->LRD_Print(); if (right) right->LRD_Print(); cout << data; } };
Node *parse(string pre, string mid) { if (!pre.length()) return NULL; Node *node = new Node(); node->data = pre.substr(0, 1).c_str()[0]; int root_pos = mid.find(node->data);
node->left = parse(pre.substr(1, root_pos), mid.substr(0, root_pos)); node->right = parse(pre.substr(root_pos + 1), mid.substr(root_pos + 1));
return node; }
int main() { string pre = "ABDECF"; string mid = "DBEAFC"; Node *node = parse(pre, mid); if (node != NULL) node->LRD_Print(); }
|
运行结果: