重建二叉树
给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。
输入输入可能有多组,以EOF结束。
每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。输出对于每组输入,用一行来输出它后序遍历结果。样例输入
DBACEGF ABCDEFG BCAD CBAD
样例输出
ACBFGED CDAB#include<stdio.h>#include<iostream>#include<string.h>#define maxn 1001using namespace std;char s1[maxn],s2[maxn];int fa=0,root,n1,n2,step=0,father[maxn],chilrd[maxn][2];int search(int l,int r,char v){ for(int i=l;i<=r;i++) if(s2[i]==v) return i; return -1;}void jianshu(int l,int r,int me){ if(me==-1) {step--;return;} chilrd[me][0]=search(l,me,s1[++step]);//printf("%d %d %d %d<-->%d\n",l,r,me,step,chilrd[me][0]); jianshu(l,me,chilrd[me][0]); chilrd[me][1]=search(me,r,s1[++step]);//printf("%d %d %d %d>-->%d\n",l,r,me,step,chilrd[me][1]); jianshu(me,r,chilrd[me][1]);}void dfs(int mt){ for(int i=0;i<=1;i++) if(chilrd[mt][i]!=-1) dfs(chilrd[mt][i]); printf("%c",s2[mt]);}int main(){ while(scanf("%s %s",s1,s2)!=EOF) { n1=strlen(s1);n2=strlen(s2); root=search(0,n2-1,s1[0]); jianshu(0,n2-1,root); /*for(int i=0;i<n2;i++) { printf("%d %d %d\n",i,chilrd[i][0],chilrd[i][1]); }*/ dfs(root); step=0; printf("\n"); } return 0; }考查二叉树的遍历思路:通过先序中序找出每个点的子节点,再递归后序输出***:输入需要用EOF输入