二叉树遍历
2015-07-22 11:39
323 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/D
题意:
利用二叉树的先序遍历和中序遍历序列,求出后序遍历序列,输出后序遍历序列。(可输入多组案例,每个字符串是不超过26个不同字母组成的)
案例:
input
DBACEGF ABCDEFG
BCAD CBAD
output
ACBFGED
CDAB
思路分析:
先序=根节点+左子树+右子树
中序=左子树+根节点+右子树
后序=左子树+右子树+根节点
由上述可知,根节点在先序序列中都处于最前面的位置,而在中序中是处于中间的位置,则可以先找到根节点在把左右分成两个不同的序列,通过相关计算找出两个序列在先序的位 置,而树的每一层都有节点,可通过递归找出每一层的节点。建立树。
因为在后序中节点处于最后的位置,则可进行倒叙储存。
后序是先左子树再右子树,而节点是进行倒序储存,所以要先进行右子树的寻找,再进行左子树节点的寻找。
递归需要结束条件,如果节点等于中序遍历序列的最前位,则左子树为空,结束左子树节点的寻找。如果节点等于中序遍历序列的最后位,则右子树为空,结束右子树节点的寻找。
源代码如下:
题意:
利用二叉树的先序遍历和中序遍历序列,求出后序遍历序列,输出后序遍历序列。(可输入多组案例,每个字符串是不超过26个不同字母组成的)
案例:
input
DBACEGF ABCDEFG
BCAD CBAD
output
ACBFGED
CDAB
思路分析:
先序=根节点+左子树+右子树
中序=左子树+根节点+右子树
后序=左子树+右子树+根节点
由上述可知,根节点在先序序列中都处于最前面的位置,而在中序中是处于中间的位置,则可以先找到根节点在把左右分成两个不同的序列,通过相关计算找出两个序列在先序的位 置,而树的每一层都有节点,可通过递归找出每一层的节点。建立树。
因为在后序中节点处于最后的位置,则可进行倒叙储存。
后序是先左子树再右子树,而节点是进行倒序储存,所以要先进行右子树的寻找,再进行左子树节点的寻找。
递归需要结束条件,如果节点等于中序遍历序列的最前位,则左子树为空,结束左子树节点的寻找。如果节点等于中序遍历序列的最后位,则右子树为空,结束右子树节点的寻找。
源代码如下:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char a[30],b[30],c[30]; int n,m; void build(int x1,int y1,int x2,int y2) { m--; c[m]=a[x1]; //倒叙储存节点 int i=x2; while(b[i]!=c[m])i++; //找到中序遍历序列中节点的位置 int s=i-x2; if(i!=y2)build(x1+s+1,y1,i+1,y2); //寻找右子树节点 if(i!=x2)build(x1+1,x1+s,x2,i-1); //寻找左子树节点 } int main() { while(scanf("%s%s",a,b)!=EOF) { n=strlen(a); //求出序列长和节点个数 m=n; build(0,n-1,0,n-1); //建立树 for(int i=0;i<n;i++) cout<<c[i]; cout<<endl; } return 0; }
相关文章推荐
- eclipse 新建SDK项目
- C#判断网站是否能访问或者断链的方法
- hd-1093:A+B for Input-Output Practice (V)
- 【iOS开发】企业版证书($299)In-House方式发布指南
- 【UIKit】-5,6,7-UIActivity - 系统服务,社交信息等
- [DLX重复覆盖] hdu 2828 Lamp
- java_acm快速输入和输出
- Android 手机震动功能实现
- php学习笔记
- 零客户机Zero Client访问Vie桌面无法识别公安加密狗
- mybatis 的mapper代理小结
- Search in Rotated Sorted Array
- Java NIO 特性学习
- 常见八种安卓开发报错的方式
- POJ-3006 Dirichlet's Theorem on Arithmetic Progressions
- Spark: sortBy和sortByKey函数详解
- linq group by max 多表链接实例
- webservice远程调试开启
- HDU 1312:Red and Black(DFS搜索)
- 大数据处理分析的工具介绍