题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=16)。
输入
每个测试文件只包含一组测试数据,每组输入包含两行,第一行输入一个字符串表示二叉树的中序排列,第二行输入一个字符串表示二叉树的后序排列。
输出
对于每组输入数据,输出二叉树的先序排列。
样例输入
BADC
BDCA
样例输出
ABCD
思路
根据输入的中序排列和后序排列构造出二叉树,再输出二叉树的先序排列。
构造方法:
找出后序排列的最后一个元素,即为树的根,在中序排列里面查找这个元素,这个元素左边的是左子树,右边的是右子树。在后序排列里面找出对应左子树和右子树的部分,继续之前的操作。
代码
#include<iostream>
#include<cstring>
using namespace std;
char tree[999999],en[20],middle[20]; //tree来存放二叉树,en存放后序排列,middle存放中序排列
void biuld(int a,int b,int c,int d,int n){ //构造二叉树
if(n>999998||a>b||c>d)
return;
tree[n]=en[d];
int i;
for(i=a;i<=b&&middle[i]!=en[d];i++);
biuld(i+1,b,d-(b-i),d-1,2*n+1);
biuld(a,i-1,c,d-(b-i)-1,2*n);
}
void fun(char tree[],int n){ //输出二叉树的前序排列
if(n>999998)
return;
if(tree[n]=='\0')
return;
cout<<tree[n];
fun(tree,2*n);
fun(tree,2*n+1);
}
int main(){
cin>>middle>>en;
for(int i=0;i<19;i++){
tree[i]='\0';
}
biuld(0,strlen(middle)-1,0,strlen(en)-1,1);
fun(tree,1);
return 0;
}
本文介绍了一种从二叉树的中序和后序遍历结果中构建二叉树,并输出先序遍历结果的方法。通过递归地确定根节点,划分左右子树,最终实现了遍历结果的转换。
423

被折叠的 条评论
为什么被折叠?



