HRBUST
来源:互联网 发布:安卓清理软件 编辑:程序博客网 时间:2024/04/29 22:58
题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2040点击打开链接
二叉树的遍历Time Limit: 1000 MSMemory Limit: 32768 KTotal Submit: 252(72 users)Total Accepted: 106(66 users)Rating: Special Judge: NoDescription给出一棵二叉树的中序和前序遍历,输出它的后序遍历。Input本题有多组数据,输入处理到文件结束。
每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。
接下来的一行每行包括n个整数,表示这棵树的中序遍历。
接下来的一行每行包括n个整数,表示这棵树的前序遍历。
3<= n <= 100
Output每组输出包括一行,表示这棵树的后序遍历。Sample Input74 2 5 1 6 3 7
1 2 4 5 3 6 7
首先需要知道前序遍历、中序遍历和后序遍历之间的关系 以及他们的遍历方法
前序遍历的第一个为树根
再观察中序遍历 确认根的位置
然后中序遍历中根的左边为左子树,右边为右子树
然后将两棵树看做新的树
递归判断
如果不够清楚可以翻一翻《挑战程序设计竞赛2》
里面有很巧妙地代码
下面的加入了建树的过程 方法与书中代码相同
#include <iostream>#include <queue>#include <stdio.h>#include <stdlib.h>#include <stack>#include <limits>#include <string>#include <string.h>#include <vector>#include <set>#include <map>#include <algorithm>#include <math.h>using namespace std;int n=0;struct tree{ int val; struct tree* l; struct tree* r;};vector<int > pre;vector<int > in;int ii=0;tree * after(int l,int r){ if(l>=r) return NULL; tree *mid = new tree; mid->val=pre[ii++]; int m=(find(in.begin(),in.end(),mid->val)-in.begin()); mid->l=after(l,m); mid->r=after(m+1,r); return mid;}void show(tree* root){ if(root==NULL) return ; show(root->l); show(root->r); printf("%d ",root->val);}int main(){ int n,k; while(cin >> n) { for(int i=0;i<n;i++) { cin >> k; in.push_back(k); } for(int i=0;i<n;i++) { cin >> k; pre.push_back(k); } tree* root=after(0,n); show(root); cout << endl; }}
如果给出条件为中序遍历和后序遍历 则类比前序遍历和中序遍历可以找到规律
后序遍历最后一个为根节点 然后通过中序遍历判断左右子树
注意后序遍历先算右子树
#include <iostream>#include <queue>#include <stdio.h>#include <stdlib.h>#include <stack>#include <limits>#include <string>#include <string.h>#include <vector>#include <set>#include <map>#include <algorithm>#include <math.h>using namespace std;int n=0;struct tree{ int val; struct tree* l; struct tree* r;};vector<int > post;vector<int > in;int ii=n;tree* after(int l,int r){ if(l>=r) return NULL; tree *mid = new tree; mid->val=post[ii--]; int m=(find(in.begin(),in.end(),mid->val)-in.begin()); mid->r=after(m+1,r); mid->l=after(l,m); return mid;}void show(tree* root){ if(root==NULL) return ; printf("%d ",root->val); show(root->l); show(root->r); }int main(){ int n,k; while(cin >> n) { ii=n-1; for(int i=0;i<n;i++) { cin >> k; in.push_back(k); } for(int i=0;i<n;i++) { cin >> k; post.push_back(k); } tree* root=after(0,n); show(root); cout << endl; }}
阅读全文
1 0
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- Hrbust
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- HRBUST
- Hrbust 1073
- HRBUST 2250
- hrbust 1429
- hrbust 逃脱
- 计算任意数阶乘n!末尾所含0的个数
- Unity_设计模式简介_025
- String、StringBuilder、StringBuffer
- TreeMap实现原理及源码分析
- ORC源码阅读(1)
- HRBUST
- adaboost原理(包含权重详细解释)
- Linux小知识
- 诡异的线程加锁问题
- go 读取文件源码解析
- 【vue】生命周期
- 如何实现单链表的增删操作
- 线程
- 用div模仿多行文本框(文本框高度自适应)