小明在做数据结构的作业,其中一题是给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。
输入描述
输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。
输出描述
对于每组输入,输出对应的二叉树的后续遍历结果。
输入:
DBACEGF ABCDEFG
BCAD CBAD
输出:
ACBFGED
CDAB
#include <iostream>
#include <queue>
using namespace std;
queue<char> MyQueue;
void GetPostoTrav(string i_PreoTraveStr,string i_MediumTraveStr)
{
int LengthOfPreoTrave = i_PreoTraveStr.length();
if (LengthOfPreoTrave == 0)
return;
else if (LengthOfPreoTrave == 1)
MyQueue.push(i_PreoTraveStr[0]);
else
{
int RootNode = i_MediumTraveStr.find(i_PreoTraveStr[0]);
GetPostoTrav(i_PreoTraveStr.substr(1, RootNode), i_MediumTraveStr.substr(0, RootNode));//参数为左支数的前序遍历和中序遍历
GetPostoTrav(i_PreoTraveStr.substr(RootNode + 1, LengthOfPreoTrave - 1 - RootNode), i_MediumTraveStr.substr(RootNode + 1, LengthOfPreoTrave - 1 - RootNode));//参数为右支数的前序遍历和中序遍历
MyQueue.push(i_PreoTraveStr[0]);
}
}
int main()
{
string PreoTraveStr, MediumTraveStr;
int i = -1;
while (++i, cin >> PreoTraveStr >> MediumTraveStr)
{
GetPostoTrav(PreoTraveStr, MediumTraveStr);
MyQueue.push('\n');
}
while (MyQueue.size() != 1)
{
cout << MyQueue.front();
MyQueue.pop();
}
return 0;
}
方法原理:使用递归的方法,根据前序遍历和中序遍历查找出左右分支的子树,再根据子树的前序遍历和中序遍历查找子树的左右分支,一直查找到最后一层。