求先序排列

本文介绍了一种从二叉树的中序和后序遍历结果中构建二叉树,并输出先序遍历结果的方法。通过递归地确定根节点,划分左右子树,最终实现了遍历结果的转换。

题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值