uva 563 Tree Recovery
2015-12-07 21:14
176 查看
输入一颗二叉树的先序遍历和中序遍历,输出后序遍历序列;
样例输入输出:
DBACEGF ABCDEFG —> ACBFGED
BCAD CBAD —> CDAB
// 先序 = root + 左子序 + 右子序
中序 = 左子序 + root + 右子序
后序 = 左子序 + 右 子序 + root
样例输入输出:
DBACEGF ABCDEFG —> ACBFGED
BCAD CBAD —> CDAB
// 先序 = root + 左子序 + 右子序
中序 = 左子序 + root + 右子序
后序 = 左子序 + 右 子序 + root
#include "iostream" #include "string" #include "cstdio" #include "cstring" #include "cmath" #include "map" #include "stack" #include "algorithm" using namespace std; string recovery(string s1,string s2) { //s1是先序,s2是中序,返回后序 if(s1.size() == 0) return ""; //结束条件写在前面 if(s1.size() == 1) return s1; char root = s1[0]; // 根节点是先序的第一个节点 string l1,l2,r1,r2; int len,k; len = s2.size(); //先序与后序的总长度都是len for(int i = 0; i < len; i++) { if(s2[i] == root) { //找到root节点在中序中的位置,用k保存 k = i; break; } } for(int i = 1; i <= k; i++) l1 = l1+s1[i]; //左子序的先序 for(int i = k+1; i < len; i++) r1 = r1 + s1[i]; // 右子序的先序 for(int i = 0; i <= k-1; i++) l2 = l2 + s2[i]; // 左子序的中序 for(int i = k+1; i < len; i++) r2 = r2 + s2[i]; //右子序的中序 return recovery(l1,l2) + recovery(r1,r2) + root; //递归求后序,后序 = 排列好的左子序 + 排列好的右子序 + root; } int main(){ ios::sync_with_stdio(false); string s1,s2; while(cin >> s1 >> s2) { cout << recovery(s1,s2) << endl; } return 0; }
相关文章推荐
- 交换button中图片和按钮的位置
- _mm_packus_epi16
- 分析UIWindow
- [string]字符串中几个比较难的算法和容易搞混的题目
- Continuous Observation Hidden Markov Model with Gaussian Mixture
- spring-boot 测试
- 【java学习笔记s】线程1
- LightOJ 1079 - Just another Robbery (01背包)
- linux下shell显示-bash-4.1#不显示路径解决方法
- Android网络传输框架的核心代码量对比
- UDID和openUDID的区别
- 2、OpenSceneGraph中添加节点、删除节点、隐藏节点以及添加开关的用法
- Codeforces 514 D R2D2 and Droid Army(RMQ+二分法)
- 一些知识点的初步理解_9(独立成分分析-ICA,ing...)
- Java中线程基本知识整理
- 创建控制器的3种方式、深入了解view的创建和加载顺序
- HDU 5592 还原逆序数(树状数组+二分)
- liunx 的安装
- N后问题 Java版
- 深度学习相关链接