题目来源: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