重建二叉树
给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。
输入
输入可能有多组,以EOF结束。
每组输入包含两个字符串,分别为树的前序遍历和中序遍历。每个字符串中只包含大写字母且互不重复。
输出
对于每组输入,用一行来输出它后序遍历结果。
理论知识可以参考这个大佬的博客:
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73260878e482a958448e435061e5a38b8fc7f794c5189822f3b1ced545be0f636743d0637b7ec92ce1583afd7756fde28230016913518c469abdc352fd621e04d9faf0e97cae733e3b9a2a7c82552dd52756df0f49c2e7703ba6fe76335f4a7e95f642c07cee827648f4e072e885246a14689f7436b10f1f4ca5d3cd45cd2766597b834c02962b604d3140c5546b738c21f505627903c308e322a05e2fc2be33d0f4234b738a4cfc3a19f489bdd9a26e8f9dcd8248211e4d29e8a664300458a22a9dabba53c145272afdda915d342b7ed98ca5be965c06159ad2977386abe7ce5869820f4755b84f0188d3e56273f0bafa402fd62046f26a94e0fc11cd702ba990749cb9eee9f9e6552afee&p=c23bd50286cc41af58ba8c2d0214bb&newp=997ec54ad6c341fe0be296344d5dcf231610db2151d7d41e6b82c825d7331b001c3bbfb423241602d8c7776d04aa495ee1fa317835052ba3dda5c91d9fb4c57479d9&user=baidu&fm=sc&query=%B8%F8%B6%A8%D2%BB%BF%C3%B6%FE%B2%E6%CA%F7%B5%C4%C7%B0%D0%F2%B1%E9%C0%FA%BA%CD%D6%D0%D0%F2%B1%E9%C0%FA%B5%C4%BD%E1%B9%FB%2C%C7%F3%C6%E4%BA%F3%D0%F2%B1%E9%C0%FA%A1%A3&qid=d70328c800038146&p1=3
每次从先序遍历中找到根结点,然后在中序中确定左右子树,可以保证输出是后序输出;
代码如下
#include <stdio.h> #include <cstring> #include <iostream> using namespace std; int aCnt,len; char pre[1001],mid[1001],ans[1001]; //pStart:前序序列的开始位置; pEnd 前序结束位置; mStart: 中序开始位置,mEnd:中序结束的位置 void back(int pStart,int pEnd, int mStart, int mEnd) { int k; if(pStart>pEnd||mStart>mEnd)return; //mid[k] 当前遍历树的 根节点 for(k=mStart;k<=mEnd;k++) if(pre[pStart]==mid[k])break; back(pStart+1,pStart+k-mStart,mStart,k-1); //后续遍历 左子树 back(pStart+k-mStart+1,pEnd,k+1,mEnd); //后续遍历 右子树 ans[aCnt++]=mid[k]; //存储根节点 } int main() { int n; while(~scanf("%s%s",pre,mid)) { len=strlen(pre); aCnt=0; back(0,len-1,0,len-1); for(int i=0;i<aCnt;i++)printf("%c",ans[i]); printf("\n"); } return 0; }