题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数
≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入
BADC
BDCA
输出
ABCD
题目思路:
1.根据后序排列最后一个位置的值确定根值,去中序排列找到该值的位置,从而在中序节点将树分为中序的左右两个子树
2.假设中序左子树长度为n1,中序右子树长度为n2,去后序排列中截取出相应的后序的左右子树,循环往复
代码:
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
struct Tree
{
Tree *l,*r;
char v;
}*tree;
// a中序 b 后序
//跟据b找到的根将a数组分为两部分
void px(Tree *tree1,char *a,char *b)
{
int n=strlen(b);
if(n==1)
{
tree1->v=b[0];
return ;
}
// a1 b1 存储左节点的中序 后序
// a2 b2 存储右节点的中序 后序
char *a1,*a2,*b1,*b2;
b1=new char[100];
b2=new char[100];
//根节点赋值
tree1->v=b[n-1];
//a2成为中序右子树
a2=strchr(a,b[n-1]);
a2++;
int k=strlen(a2);
//a1成为中序左子树
a1=a;
a1[n-k-1]=0;
//b1成为后序左子树
strncpy(b1,b,n-k-1);
b1[n-k-1]=0;
//b2成为后序右子树
strncpy(b2,b+n-k-1,k);
b2[k]=0;
//左子树处理
if(strlen(a1)!=0)
{
tree1->l=new Tree();
px(tree1->l,a1,b1);
}
//右子树处理
if(strlen(a2)!=0)
{
tree1->r=new Tree();
px(tree1->r,a2,b2);
}
}
//输出前序二叉树
void sc(Tree *tree1)
{
cout<<tree1->v;
if(tree1->l!=nullptr)
{
sc(tree1->l);
}
if(tree1->r!=nullptr)
{
sc(tree1->r);
}
}
int main()
{
char a[1000],b[1000];
cin>>a>>b;
tree=new Tree();
px(tree,a,b);
sc(tree);
return 0;
}