同学整理的,顺便传上分享下
一,已知先序和中序 求后序
1 #include2 #include 3 #include 4 using namespace std; 5 char s1[10],s2[10],ans[10]; 6 int o = 0; 7 void tree(int n , char * s1 , char * s2 , char* s) 8 { 9 if(n <= 0) return ;10 int p = strchr(s2,s1[0])-s2; //找到根结点在中序遍历中的位置 strchr 查找根节点字符在s1中首次出现的位置11 tree(p,s1+1,s2,s); //递归构造左子树的后续遍历12 tree(n-p-1,s1+p+1,s2+p+1,s+p); //递归构造右子树的后序遍历13 s[n-1]=s1[0]; //把根节点添加到最后14 }15 int main()16 { //输入的是先序和中序17 while(cin>>s1>>s2)18 {19 int n = strlen(s1);20 tree(n,s1,s2,ans);21 ans[n]='\0';22 printf("%s\n",ans);23 }24 return 0;25 }
1 #include2 #include 3 #include 4 using namespace std; 5 char s1[10],s2[10],ans[10]; 6 int o = 0; 7 void tree(int n , char * s1 , char * s2 , char* s) 8 { 9 if(n <= 0) return ;10 int p = strchr(s1,s2[n-1])-s1; //找到根结点在中序遍历中的位置11 s[o++] = s2[n-1]; //把根节点添加到最前面(正好与后序相反)或者每次就直接输出s2[n-1],这样就不需要s再来保存12 tree(p,s1,s2,s); //递归构造左子树的后续遍历13 tree(n-p-1,s1+p+1,s2+p,s); //递归构造右子树的后续遍历14 }15 int main()16 { //输入的是中序和后续17 while(cin>>s1>>s2)18 {19 int n = strlen(s1);20 tree(n,s1,s2,ans);21 ans[n]='\0';22 printf("%s\n",ans);23 }24 return 0;25 }