核心思想:分治法
1 已知先序、中序 求后序
pre_pos 、 in_pos 、 post_pos 分别表示前中后 索引(初始均为0)
int post[MAX]; int in[MAX]; int pre[MAX]; void to_post_tree(int pre_pos, int in_pos, int post_pos, int n) { int root; if (n == 0) return; if (n == 1) { post[post_pos] = pre[pre_pos]; return; } root = pre[pre_pos]; post[post_pos + n - 1] = root;//每次把当前处理区域的最后一个元素放入 int i; for (i = 0; i < n; i++) { if (in[in_pos + i] == root) break; } int l_len, r_len; l_len = i; r_len = n - i - 1; to_post_tree(pre_pos + 1, in_pos, post_pos,l_len); to_post_tree(pre_pos + l_len+1, in_pos + l_len+1, post_pos + l_len, r_len); } 2 已知中序、后序求先序: // 注意处理端点 void to_pre_tree(int pre_pos, int in_pos, int post_pos, int n) { int root; int i; if (n == 0) return; if (n == 1) { pre[pre_pos] = post[post_pos]; return; } root = post[post_pos+n - 1]; pre[pre_pos] = root; for (i = 0; i < n; i++) { if (in[in_pos+i] == root) break; } int l_len, r_len; l_len = i;//左子树长度 r_len = n - l_len - 1;//右子树长度 to_pre_tree(pre_pos+1, in_pos, post_pos, l_len);//递归处理左子树 与右子树 to_pre_tree(pre_pos + l_len+1, in_pos + l_len + 1, post_pos + l_len, r_len); } 两种 方式 差别 仅在 对于 根 位置 处理上