题目来源:http://poj.org/problem?id=2255
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 11649 | Accepted: 7311 |
Description
D
/
/
B E
/ \
/ \
A C G
/
/
F
Input
Output
Sample Input
DBACEGF ABCDEFG BCAD CBAD
Sample Output
ACBFGED CDAB
Source
题意:
给出二叉树的前序和中序遍历,求后序遍历
题解:
根据三种遍历的特点
1.前序遍历: 根 左 右
2.中序遍历:左 根 右
3.后序遍历:左 右 右
首先根据前序遍历确定根节点,然后再根据中序遍历确定左子树和右子树,然后再按此方法依次递归左子树和右子树并将根节点入栈。
最后,栈中保存的便是该树的后序遍历。
PS: 这题在半年前就看过,那个时候对树的遍历并不熟悉~~ 还不完全理解,也就不会打代码了~ 今天中午又把这题翻出来,稍微分析一下很快就实现了。一次AC
AC代码:
#include<iostream>
#include<string>
using namespace std;
int posmap[256];
string pretree,midtree,posttree="";
void init()
{
posttree="";
for(int i=0;i<pretree.size();i++)
posmap[pretree[i]]=i+1;
}
void postorder(int left,int right)
{
if(left==right) return ;
int Min=posmap[midtree[left]],Mpos=left;
for(int i=left+1;i<right;i++){
if(Min>posmap[midtree[i]]){
Min=posmap[midtree[i]];
Mpos=i;
}
}
postorder(left,Mpos);
postorder(Mpos+1,right);
posttree+=midtree[Mpos];
}
int main()
{
while(cin>>pretree>>midtree)
{
init();
postorder(0,midtree.size());
cout<<posttree<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/mummyding/article/details/41042127