求先序排列
问题描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
样例:
输入:
BADC
BDCA
输出:
问题描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
样例:
输入:
BADC
BDCA
输出:
ABCD
分析:
后序排列中,最后一个字符为整个树的根
中序排列中,根的左边为左树,根的右边为右树
根据这样的规律,我们可以取后序排列中的最后一个字符,在中序排列中找出左树和右树,再继续取后序排列中的字符,在分出的左树右树中继续寻找根,如此递归建立一个二叉树,最后先序输出
代码:
#include <iostream>
#include<string>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
string post,mid;
struct tree//二叉树
{
char letter;
tree* left=NULL;
tree* right=NULL;
};
void output(tree *p)//先序输出
{
if(p==NULL)
return;
cout<<p->letter;
output(p->left);
output(p->right);
}
char buildTree(string &post,string mid,tree *p)//建立二叉树
{
char postLast=post[post.size()-1];//取后序排列中最后一个字符
for(int i=0;i<mid.size();i++)
{
if(mid[i]==postLast)//寻找根
{
string left(mid,0,i);//分出左树
string right(mid,i+1);//分出右树
//建立子树
if(left.size()!=0)
p->left=new tree;
if(right.size()!=0)
p->right=new tree;
p->letter=postLast;//赋值
post.erase(post.size()-1);//抹去后序排列的最后一个字符,这样倒数第二个字符成为最后一个字符
//继续递归
buildTree(post,right,p->right);
buildTree(post,left,p->left);
}
}
return 0;
}
int main(int argc, char** argv)
{
cin>>mid>>post;
tree *p=new tree;
buildTree(post,mid,p);
output(p);
return 0;
}