2013-08-12
已知三种序列中任意两种(前序和后序这一组合除外),均可递归求出另一序列唯一解。今天下午的成果,主要是复习一下递归思想
1 /** 已知二叉树前序和中序序列 输出后序序列 2 pre前序序列 in中序序列 end后序序列 3 */ 4 void pre_in(int length, char *pre, char *in, char *end) 5 { 6 int p; 7 if(length<=0) return; 8 p=strchr(in,pre[0])-in; //获取前序第一个字符在中序序列中的位置 9 pre_in(p, pre+1, in, end);//递归左子树 10 pre_in(length-p-1, pre+p+1, in+p+1, end+p);//递归右子树 11 end[length - 1] = pre[0];// 把根节点放在最后 12 } 13 /** 已知二叉树后序和中序序列 输出后序序列 14 pre前序序列 in中序序列 end后序序列 15 */ 16 void in_end(int length, char *in, char *end, char *pre) 17 { 18 if(length<=0)return; 19 int p=strchr(in,end[length-1])-in; 20 in_end(p, in, end, pre+1); 21 in_end(length-1-p, in+p+1, end+p, pre+p+1); 22 pre[0]=end[length-1];//把根节点放在首要位置 23 } 24 /**已知二叉树后序和中序序列 输出后序序列 25 **pre前序序列 in中序序列 end后序序列 26 问题:前序和后序不能唯一确定中序序列 27 *此可以求出对应的度数部位不为0的左子树不为空的中序序列 28 *如:E G F -->pre 29 * F G E -->mid 30 * F G E -->end 31 但是对于以下情况不可输出 32 E G F 33 E F G 34 F G E 35 */ 36 void pre_end(int length, char *pre, char *end, char *in) 37 { 38 if(length<=0)return; 39 if(length==1){ 40 in[0]=pre[0];return; 41 } 42 int p= strchr(end,pre[1])-end; 43 pre_end(p+1, pre+1, end, in); 44 pre_end(length-(p+1)-1, pre+p+2, end+p+1, in+p+1); 45 in[p+1]=pre[0];//根节点放在中间位置 46 }