usaco American Heritage
2015-09-28 08:39
387 查看
给一颗二叉树的先序遍历,一个中序遍历,求输出后序遍历。
这是大一时候数据结构老师布置的课后作业,当时我记着这道题是我仅有的做错的题,老师还专门给我说过我的算法不合格。但是我后来并没有改正(因为懒)。
我的做法是将这个二叉树恢复出来,然后后序遍历。
当然可以不恢复出来直接搜,但我不觉着那样好写些,好多边界要处理。
这是大一时候数据结构老师布置的课后作业,当时我记着这道题是我仅有的做错的题,老师还专门给我说过我的算法不合格。但是我后来并没有改正(因为懒)。
我的做法是将这个二叉树恢复出来,然后后序遍历。
当然可以不恢复出来直接搜,但我不觉着那样好写些,好多边界要处理。
/* ID: modengd1 PROG: heritage LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <cstring> #include <string.h> using namespace std; string inorder; string preorder; int N; int a; struct node { string whole; int left; int right; char value; }; node tree[27<<2]; void build(int root) { if(tree[root].whole.size()==0) return; tree[root].value=preorder[a]; a++; int b=tree[root].whole.find(tree[root].value); tree[root].left=N++; tree[root].right=N++; tree[tree[root].left].whole=tree[root].whole.substr(0,b); build(tree[root].left); tree[tree[root].right].whole=tree[root].whole.substr(b+1,tree[root].whole.size()-b); build(tree[root].right); } void output(int root) { if(tree[root].whole.size()==0) return; output(tree[root].left); output(tree[root].right); printf("%c",tree[root].value); } int main() { freopen("heritage.in","r",stdin); freopen("heritage.out","w",stdout); char ch; for(int i=0;scanf("%c",&ch)&&ch!='\n';i++) inorder.push_back(ch); for(int i=0;scanf("%c",&ch)&&ch!='\n';i++) preorder.push_back(ch); int root=1; tree[root].whole=inorder; tree[root].value=preorder[0]; a=0; N=2; build(1); output(1); cout<<endl; return 0; }
相关文章推荐
- UITableView
- 电脑软件
- VIA头域
- n皇后2种解题思路与代码-Java与C++实现
- DB Error: 1 "unrecognized token: ":""
- 深入理解java虚拟机(1)------内存区域与内存溢出
- 将博客搬至CSDN
- 数据库字典查询
- hibernate关系映射配置
- Number Sequence(快速幂矩阵)
- 201509280825_《css3——media query整理2》
- 装饰模式
- 【jQuery】ajax提交xml
- Ajax中的get和post两种请求方式的异同
- 为什么不记录慢速查询?
- hdu--1257
- cocos2dx CCControlButton button大事
- 排序算法汇总
- 三分钟学会JUnit单元测试
- BZOJ 4034 [HAOI2015]T2 树链剖分+线段树