九度OJ - 1078 - 二叉树遍历
2016-05-09 23:39
260 查看
题目描述
二叉树的前序、中序、后序遍历的定义:前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。
输入
两个字符串,其长度n均小于等于26。第一行为前序遍历,第二行为中序遍历。
二叉树中的结点名称以大写字母表示:A,B,C….最多26个结点。
输出
输入样例可能有多组,对于每组测试样例,输出一行,为后序遍历的字符串。
样例输入
ABCBAC
FDXEAG
XDEFAG
样例输出
BCAXEDGAF
来源
2006年清华大学计算机研究生机试真题先序遍历:
访问根节点
先序遍历左子树
先序遍历右子树
中序遍历:
中序遍历左子树
访问根节点
中序遍历右子树
后序遍历:
后序遍历左子树
后序遍历右子树
访问根节点
因为先序遍历的第一个节点一定是根,所以从先序遍历着手,根据递归,先遍历左子树,再遍历右子树
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int MAXN = 30; char preOrder[MAXN]; //前序 char inOrder[MAXN]; //中序 char ans[MAXN]; int cnt; //// 返回root在前序中的位置 int GetPreOrderLoc(char root){ int len = strlen(preOrder); for(int i = 0; i < len; i++){ if(preOrder[i] == root){ return i; } } } // 返回root在中序中的位置 int GetInOrderLoc(char root){ int len = strlen(inOrder); for(int i = 0; i < len; i++){ if(inOrder[i] == root){ return i; } } } //递归处理子树preOrder[l...r] //root为该子树的根节点,l r指的是在中序中的位置 void dfs(char root, int l, int r){ if(l <= r){ int p1 = GetPreOrderLoc(root); //root在前序中的位置 int p2 = GetInOrderLoc(root); //root在中序中的位置 //递归左子树 dfs(preOrder[p1+1], l, p2-1); //递归右子树 dfs(preOrder[p1+p2-l+1], p2+1, r); ans[cnt++] = root; } } int main() { while(scanf("%s %s", preOrder, inOrder)!=EOF){ cnt = 0; dfs(preOrder[0], 0, strlen(preOrder)-1); for(int i = 0; i < cnt; i++){ cout << ans[i]; } cout << endl; } return 0; }
相关文章推荐
- Iwfu-同时使用Eclipse和AndroidStudio开发时GenyMotion问题
- 带着大家走进iOS单元测试世界
- 用Fiddler模拟低速网络环境
- 树的面试题
- xcode添加背景音乐/音效
- 富文本编辑器
- 菜刀ASP 新建文件抓包
- 15 个 Android 通用流行框架大全
- HTML基本标签
- HQL中select count(*)与fetch使用出错
- HTML基本标签
- HTML基本标签
- UIAlertController & UIAlertView 对话框
- 菜刀ASP 新建文件夹抓包
- Codeforces Round #156 (Div. 2) C. Almost Arithmetical Progression
- odbc连接数据库
- 文件管理 - 4
- Linux:例行性工作
- hdu_4826_Labyrinth_2014百度之星(dp)
- BZOJ 1030 【JSOI2007】文本生成器