简单易忘~~~
已知先序中序求后序:
/* 已知先序和中序 求后序 */ #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define maxn 1010 int pre[maxn], in[maxn], post[maxn]; int n; int cnt; int ask_root(int len, int root_num, int in[]) { //在当前的子树立找根节点 for (int i=0; i<len; ++i) { if (in[i] == root_num) return i; } return -1; } void askPost(int len, int pre[], int in[]) { // 当前先序和中序序列的长度 int root_id = ask_root(len, pre[0], in); if (root_id < 0) return; askPost(root_id, pre+1, in); // 递归到当前根节点的左子树 askPost(len-root_id-1, pre+root_id+1, in+root_id+1); // 递归到当前根节点的右子树 post[cnt++] = pre[0]; // 递归完左子树和右子树之后 剩下了最左的叶子结点 加入后序序列中 } int main() { while(cin >> n) { cnt = 0; for (int i=0; i<n; ++i) { // 输入先序序列 cin >> pre[i]; } for (int i=0; i<n; ++i) { // 输入中序序列 cin >> in[i]; } askPost(n, pre, in); // for (int i=0; i<n; ++i) { cout << post[i] << endl; } } return 0; }
已知中序后序求先序:
/* 已知二叉树的中序和后序 求其先序 */ #include <stdio.h> #include <string.h> #include <iostream> #define maxn 1010 using namespace std; int pre[maxn], in[maxn], post[maxn]; int n; int cnt; int ask_root(int len, int root, int in[]) { for (int i=0; i<len; ++i) { if (in[i] == root) return i; } return -1; } void askPre(int len, int in[], int post[]) { int root_id = ask_root(len, post[len-1], in); // cout << root_id << "===\n"; if (root_id == -1) return; pre[cnt++] = post[len-1]; // 将当前根节点加入到先序序列中 askPre(root_id, in, post); // 递归到左子树 askPre(len-root_id-1, in+root_id+1, post+root_id); //递归到右子树 } int main() { while(cin >> n) { cnt = 0; for (int i=0; i<n; ++i) { cin >> in[i]; // 输入中序 } for (int i=0; i<n; ++i) { cin >> post[i]; // 输入后序 } askPre(n, in, post); for (int i=0; i<n; ++i) { cout << pre[i] << endl; } } return 0; }