题目
给出一棵二叉树的前序和中序遍历的结果,还原这棵二叉树并输出其后序遍历的结果。
解法
这道题目曾经做过,可以参考这里。
下面看一下解法:
(
前序遍历:
‘根节点’+‘左子树的前序遍历’+‘右子树的前序遍历’!而在这里体现出来就是‘A’+‘BDEGH’+‘CFIJ’”。
后续遍历:
是‘左子树的中序遍历’+‘根节点’+‘右子树的中序遍历’!在这里也就是‘DBGEH’+‘A’+‘CIJF’。
这样可以找到根节点‘A’,而后把遍历分为左右两个部分,再递归求解即可。
测试代码:
#include<iostream>
#include<string>
std::string preString;
std::string midString;
int position;
char *lastOrder;
///preStart前序遍历起始地址
///midStart中序遍历起始地址
///length长度
void printLastOrder(int preStart, int midStart, int length)
{
if(length<=0)
return;
for(int i=midStart;i<midStart+length;++i)
{
if(midString[i]==preString[preStart])
{
lastOrder[position]=preString[preStart];
++position;
printLastOrder(preStart+i-midStart+1,i+1,length-i+midStart-1);
printLastOrder(preStart+1,midStart,i-midStart);
break;
}
}
}
int main()
{
std::cin>>preString>>midString;
int length=preString.length();
lastOrder=new char[length];
position=0;
printLastOrder(0,0,length);
for(int i = length-1;i >=0; --i)
std::cout<<lastOrder[i];
delete[] lastOrder;
return 0;
}