重建二叉树

给定一棵二叉树的前序遍历和中序遍历的结果,求其后序遍历。

输入

输入可能有多组,以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("
");
}
return 0;
}
View Code
原文地址:https://www.cnblogs.com/new-hand/p/7241775.html