http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1489
求二叉树的先序遍历
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历
输入
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的中序遍历序列,第二个字符串表示二叉树的后序遍历序列。
输出
输出二叉树的先序遍历序列
示例输入
2 dbgeafc dgebfca lnixu linux
示例输出
abdegcf xnliu
提示
来源
GYX
示例程序
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- char in[50+5], post[50+5];
- struct tree
- {
- char data;
- tree *l, *r;
- };
- tree *build(int s1, int t1, int s2, int t2) //根据中序、后序建立二叉树
- {
- tree *root;
- int i;
- for(i=s1;i<=t1;i++) //找到当前中序序的结点编号i,中序的in[i]值与当前后序的最后一个值也就是post[t2]的值相等,中序、后序的该值左侧为左二叉树,右边为右二叉树
- if(in[i]==post[t2])
- break;
- if(i<=t1) //如果在中序中能找到对应后序结点的结点
- {
- root=new tree;
- root->data=post[t2]; //post[t2]为当前结点的data
- root->l=build(s1,i-1,s2,s2+i-s1-1); //递归建立左二叉树,其中s1、i-1模拟左二叉树的data值的数组in,s2,s2+i-s1-1(根据长度相等,均为i-s1-1)模拟右二叉树的data值的数组post
- root->r=build(i+1,t1,s2+i-s1,t2-1); //递归建立右二叉树,理论同上
- }
- else root=NULL; //不能的话返回NULL,表示结点为空
- return root;
- }
- void pre_order(tree *root) //递归先序遍历二叉树
- {
- if(root)
- {
- printf("%c", root->data);
- pre_order(root->l);
- pre_order(root->r);
- }
- }
- int main()
- {
- int t;
- while(~scanf("%d", &t))
- {
- while(t--)
- {
- scanf("%s %s", in, post);
- tree *root=build(0,strlen(in)-1,0,strlen(in)-1);
- pre_order(root); //先序遍历二叉树
- printf("\n");
- }
- }
- return 0;
- }