二叉树已知前序遍历和中序遍历,编程求后序遍历。
2014-05-30 16:21
330 查看
在这个问题之前,我们应该知道前序遍历、中序遍历、后序遍历的定义。
前序遍历:访问二叉树的根结点 + 遍历二叉树的左子树 + 遍历二叉树的右子树
中序遍历:遍历二叉树的左子树 + 访问二叉树的根结点 + 遍历二叉树的右子树
后序遍历:遍历二叉树的左子树 + 遍历二叉树的右子树 + 访问二叉树的根结点
根据前序遍历的性质,我们可以知道,前序遍历访问的第一个根结点是这个二叉树T的根结点。
又可以根据中序遍历的性质,得出根节点的左子树和右子树的结点分别是哪些。
举个例子:
前序遍历:GDAFEMHZ
中序遍历:ADEFGHMZ
显然这个二叉树T的根结点为:G
又可以根据中序遍历得出二叉树T的左子树的结点为:A、D、E、F,右子树的结点为:H、M、Z。
根据前序遍历的性质可以知道,挨着G结点的,是二叉树T左子树的根结点。所以二叉树T左子树的根结点为D。
又可以知道,前序遍历先访问到的4个结点一定是二叉树T的左子树,就可以知道二叉树T右子树的根节点为M。
递归下去就可以还原这个二叉树T了,后序遍历便可求出:AEFDHZMG。
同理,已知中序遍历和后序遍历,也可以求出前序遍历。
附上代码:
求后序遍历:
求前序遍历:
前序遍历:访问二叉树的根结点 + 遍历二叉树的左子树 + 遍历二叉树的右子树
中序遍历:遍历二叉树的左子树 + 访问二叉树的根结点 + 遍历二叉树的右子树
后序遍历:遍历二叉树的左子树 + 遍历二叉树的右子树 + 访问二叉树的根结点
根据前序遍历的性质,我们可以知道,前序遍历访问的第一个根结点是这个二叉树T的根结点。
又可以根据中序遍历的性质,得出根节点的左子树和右子树的结点分别是哪些。
举个例子:
前序遍历:GDAFEMHZ
中序遍历:ADEFGHMZ
显然这个二叉树T的根结点为:G
又可以根据中序遍历得出二叉树T的左子树的结点为:A、D、E、F,右子树的结点为:H、M、Z。
根据前序遍历的性质可以知道,挨着G结点的,是二叉树T左子树的根结点。所以二叉树T左子树的根结点为D。
又可以知道,前序遍历先访问到的4个结点一定是二叉树T的左子树,就可以知道二叉树T右子树的根节点为M。
递归下去就可以还原这个二叉树T了,后序遍历便可求出:AEFDHZMG。
同理,已知中序遍历和后序遍历,也可以求出前序遍历。
附上代码:
求后序遍历:
#include <stdio.h> #include <string.h> void gao(int n, char *ch1, char *ch2) { if(n <= 0) { return ; } int p = strchr(ch2, ch1[0]) - ch2; gao(p, ch1+1, ch2); //递归遍历左子树 p为当前节点ch1[0]的左子树的结点个数 gao(n-p-1, ch1+p+1, ch2+p+1); //递归遍历右子树 n-p-1为当前节点ch1[0]的右子树的结点个数 printf("%c", ch1[0]); } int main() { char ch1[1000], ch2[1000]; int n; while(scanf("%s %s", ch1, ch2)) { n = strlen(ch1); gao(n, ch1, ch2); puts(""); } return 0; }
求前序遍历:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; void gao(int n, char *ch1, char *ch2) { if(n <= 0) { return ; } printf("%c", ch1[0]); int p = strchr(ch2, ch1[0]) - ch2; gao(p, ch1+n-p, ch2); gao(n-p-1, ch1+1, ch2+p+1); } int main() { char ch1[1000], ch2[1000]; int n; while(scanf("%s %s", ch1, ch2)) { minn = 0; n = strlen(ch1); for(int i = 0, j = n - 1; i < j; i++, j--) { swap(ch1[i],ch1[j]); //翻转ch1串 } gao(n, ch1, ch2); puts(""); } return 0; }
相关文章推荐
- 已知二叉树的中序和后序遍历排列,求前序遍历
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- hdu1710 已知二叉树的前序遍历和中序遍历,还原二叉树,求出后序、层次遍历
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 【树】已知二叉树前序和中序遍历求后序遍历,及中序和后序遍历求前序遍历
- 已知一颗二叉树S的前序遍历和中序遍历序列,请编程输出二叉树S的后续遍历序列。
- 已知前序遍历序列和中序遍历序列,求二叉树的后序遍历
- 计算机技术——已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 已知一颗二叉树S的前序遍历和中序遍历 序列,请编程输出二叉树S的后续遍历序列.
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 3.9已知二叉树的 前序遍历和中序遍历的结果,重构出原二叉树
- 已知先序遍历和中序遍历,求后序遍历 && 求二叉树中节点的最大距离
- 已知二叉树的前序遍历和中序遍历,求二叉树的后序遍历
- (编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(非递归)
- 已知二叉树的中序遍历和前序遍历,如何求后序遍历
- 已知树的前序遍历和中序遍历,求后序遍历
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历的结果,输出后序遍历结果。