重建二叉树(1)
来源:互联网 发布:南华大学船山学院 知乎 编辑:程序博客网 时间:2024/06/01 09:32
重建二叉树:已知前序遍历和中序遍历,求其后序遍历。
Description
对于二叉树T,可以递归定义它的先序遍历、中序遍历和后序遍历如下: PreOrder(T)=T的根节点+PreOrder(T的左子树)+PreOrder(T的右子树) InOrder(T)=InOrder(T的左子树)+T的根节点+InOrder(T的右子树) PostOrder(T)=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点 其中加号表示字符串连接运算。
Input
第一行为一个整数t(0<t<10),表示测试用例个数。 以下t行,每行输入一个测试用例,包含两个字符序列s1和s2,其中s1为一棵二叉树的先序遍历序列,s2为中序遍历序列。s1和s2之间用一个空格分隔。序列只包含大写字母,并且每个字母最多只会出现一次。
Output
为每个测试用例单独一行输出后序遍历序列。
样例输入:
2 DBACEGF ABCDEFG BCAD CBAD
输出:
ACBFGED
CDABGED
分析:
先序遍历的第一个字符就是根,因此只需在中序遍历中找到它,就知道左右子树的先序和中序遍历了。例如:
先序:D BACEGF 中序:ABCD EFG
由先序遍历的第一个字符D 可知,此二叉树的根节点为D ,并且:
左子树的先序遍历为:BAC 中序遍历为:ABC
右子树的先序遍历为:EGF 中序遍历为:EFG
可用递归思想。
#include<iostream>#include<string.h> #include<cstring> using namespace std;void get(int n,char *s1,char *s2,char* res){ if(n<=0) return; int p=strchr(s2,s1[0])-s2; //由s1[0]可知道树的根节点,求出该根节点在s2中的位置,减去s2的值得到左子树的长度 get(p,s1+1,s2,res); //对左子树递归 ,p是长度,s1+1表示左子树开始的位置 ,s2不变因为只是在s2里找到s1+1[0]对应的位置 get(n-p-1,s1+p+1,s2+p+1,res+p); //对右子树递归 res[n-1]=s1[0]; //每次将s1[0]添加到结果字符串的最后一位 ,即根节点放在最后,可得后序遍历 }int main(){ char s1[1000]={0}; char s2[1000]={0}; char res[1000]={0}; int time; cin>>time; while(time--) { cin>>s1>>s2; int len=strlen(s1); get(len,s1,s2,res); cout<<res<<endl; } // system("pause"); return 0;}
- 重建二叉树(1)
- 【树1】重建二叉树
- 重建二叉树(树)
- poj2255(二叉树重建)
- poj2255(二叉树重建)
- 二叉树重建(一)
- 二叉树重建(二)
- 重建二叉树(java)
- 二叉树重建(转载)
- JOJ 1329: Tree(重建二叉树)
- 重建二叉树(编程之美)
- 1935. 二叉树重建(2)
- 重建二叉树(字符串操作实现)
- 面试经典(18)--重建二叉树
- 重建二叉树(面试题 6)
- 面试算法(五)重建二叉树
- 二叉树的重建(递归实现)
- 重建二叉树(链表实现)
- sharepoint入门
- java 中的 class path, package, jar 等基本问题
- BitmapFactory.decodeStream 返回值为null的问题
- 使用ViewSwitcher实现ListView的数据动态加载[学习]
- KMP算法详解(精华)
- 重建二叉树(1)
- android NDK 开发实例
- spring web mvc环境下使用dwr
- 集群配置及应用部署文档
- 【等待他们的必然就是痛苦】
- 几个简单的数据点平滑处理算法
- Pyinotify文件系统监控
- trouble maker
- 【拓扑排序】HDU 1285——确定比赛名次