Time Limit: 10 second
Memory Limit: 2 MB

问题描述
输入一棵二叉树的中序和后序遍历序列,输出其前序遍历序列。

Input

输入文件共两行,第一行一个字符串,表示树的中序遍历,第二行一个字符串,表示树的后序遍历。树的结点一律用小写字母表示。

Output

输出文件仅一行,表示树的后前序遍历的序列。

Sample Input

dbeac
debca

Sample Output

abdec

【题解】

这个后序遍历可以把它反转一下

如debca可以反转为acbed

然后它就会变成一个特殊的前序遍历了。

原来是输出当前节点,然后访问左儿子。然后访问右儿子。

这个特殊的前序遍历则是输出当前节点。然后访问右儿子。然后访问左儿子。

即它的访问顺序改变了。

至于为什么

后序遍历是先访问左儿子。然后访问右儿子。最后输出当前节点。

根据这个规律。可以知道最后出现的节点肯定是根节点。

那倒数第二个节点是什么呢。

肯定有这样一个过程。

左子树访问完了。然后右子树也访问完了。

可以想象。访问到右子树的最低端之后。会逐级往上输出节点。

那除了根节点之外。前一个当然就是根节点的右子树的根节点了。

再前一个(倒数第三个)则为根节点的右子树的右子树的根节点

(如果根节点的右子树存在右子树,若不存在右子树只存在左子树。那它就是根节点的

右子树的左子树的根节点)

然后。根据中序遍历的规律。我们可以找到一个根节点它的左子树和右子树包括哪一些

节点。

如根节点为p

1..p-1,p+1..r则分别为它的左子树和右子树。

这是用区间表示的。如果这段区间只有一个元素。则返回这个元素。否则返回这段区间的根节点即可。

这样我们就可以求出所有节点的左儿子和右儿子了。

最后先序遍历一下就好。

用递归写!!!!!

【代码】

#include <cstdio>
#include <cstring>int zhongxu[30], houxu[30],ll[30],rr[30],now;void input_data()
{char s[30]; //输入字符串之后。把字母转换成数字。a..z对应1..26scanf("%s", s); //houxu和zhongxu两个数组对应后序遍历和中序遍历的结果。int length = strlen(s);//strlen为获取某个字符串的长度的函数。它包含在cstring头文件中for (int i = 1; i <= length; i++)zhongxu[i] = s[i - 1] - 'a' + 1;zhongxu[0] = length;scanf("%s", s);for (int i = 1; i <= length; i++)houxu[i] = s[i - 1] - 'a' + 1;
}int sear_ch(int l,int r) //返回l..r这个区间内的根节点。
{if (l > r)return 0;if (l == r) //如果只有一个元素。则直接返回这个元素。return houxu[now--];int key2 = houxu[now];//获取这段区间的根节点。houxu遍历是用来获取根节点的!int pp;for (int i = l; i <= r; i++)//而中序遍历则可以确定这个根节点的左子树和右子树所在的区间。if (zhongxu[i] == key2){pp = i;break;}now--;//这时指针指向下一个子树的根节点 优先是右子树(如果有右子树)rr[key2] = sear_ch(pp+1, r);//寻找l..r这个区间的根节点的左儿子和右儿子。ll[key2] = sear_ch(l, pp-1);return key2;//返回这个区间的根节点给这个根节点的爸爸。
}void xianxu(int t)//这是找到所有节点的左儿子和右儿子之后进行先序遍历。
{char key = t + 'a' - 1;//把数字转成字母。putchar(key);if (ll[t] != 0)xianxu(ll[t]);if (rr[t] != 0)xianxu(rr[t]);
}void get_ans()
{int root = houxu[zhongxu[0]];//找到整棵树的根节点。now = zhongxu[0];//获取遍历序列的长度。int p;for (int i = 1;i <= zhongxu[0];i++)//获取这个根节点的位置if (zhongxu[i] == root)//以期找到这个根节点的左子树和右子树所在的区间。{p = i;break;}now--;//houxu[now]指向下一个子树的根节点(优先右子树。如果不存在右子树则指向左子树的根节点)rr[root] = sear_ch(p + 1, zhongxu[0]);ll[root] = sear_ch(1, p - 1);xianxu(root);//所有节点的左儿子和右儿子都确定了。直接输出这棵树的先序遍历结果。
}int main()
{input_data();get_ans();return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7632307.html

【7005】二叉树的遍历问题2相关推荐

  1. 二叉树的遍历(递归与非递归)

    class Node: # 定义树节点def __init__(self, value, left=None, right=None): # 节点的值及左子树.右子树self.value = valu ...

  2. 刷题:二叉树的遍历方式及根据遍历结果还原二叉树

    二叉树的遍历方式及根据遍历结果还原二叉树 1. 二叉树的遍历方式 2. 根据遍历结果还原二叉树 2.1 已知先序遍历和中序遍历还原二叉树 2.2 已知后序遍历和中序遍历还原二叉树 实验代码: 1. 二 ...

  3. 后序遍历的非递归算法python_刷题系列 - Python用非递归实现二叉树后续遍历

    顺便把Python用非递归实现二叉树后续遍历也写了. 其实前序中序和后续都是针对父节点说的.比如下面这个最简单二叉树. 前序就是ABC,父节点A在前 中序就是BAC,父节点A在中间 后序就是BCA,父 ...

  4. 二叉树 1.0 -- 创建二叉树、遍历二叉树、二叉树常见问题求解

    树的结构主要是为了查找,这个主要是为了搜索,树的结构关注的不是增删查改 树 广义上面的树的结构我们不知道树的一个节点是有几个子节点的,所以这个时候我们需要定义的一种结构就是,一个节点的孩子是可以动态的 ...

  5. PTA数据结构与算法题目集 6-9 二叉树的遍历

    PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...

  6. 【swjtu】数据结构实验6_二叉树的遍历算法

    实验内容及要求: 编写程序,用先序递归遍历法建立二叉树的二叉链表存储结构,然后输出其先序.中序.后序以及层次遍历结点访问次序.其中层次遍历的实现需使用循环队列.二叉树结点数据类型建议选用字符类型. 实 ...

  7. 重拾算法(3)——用458329个测试用例全面测试二叉树和线索二叉树的遍历算法

    重拾算法(3)--用458329个测试用例全面测试二叉树和线索二叉树的遍历算法 在"上一篇"和"上上一篇"中,我给出了二叉树和线索二叉树的遍历算法.给出算法容易 ...

  8. 二叉树的遍历(包括递归和非递归方法)

    二叉树的遍历 遍历二叉树,就是按一定的某条搜索路径走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次.由于二叉树是非线性结构,每个结点都有可能有两棵子树,因此,树的遍历实质上是将二叉树的 ...

  9. java数据结构二叉树遍历_java数据结构 之 二叉树的遍历(1)

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...

  10. 二叉树深度优先遍历和广度优先遍历

    二叉树深度优先遍历和广度优先遍历

最新文章

  1. Java子线程中的异常处理(通用)
  2. C++ 莫队算法(转)
  3. dlib android
  4. 我的中年危机来得很自然
  5. 【面试】编译器为我们实现了几个类成员函数?(c++)
  6. 上接游戏人生Silverlight(2) - 趣味钢琴[Silverlight 2.0(c#)]
  7. 开源FastGithub
  8. python在线作业_南开大学20春学期《Python编程基础》在线作业参考答案
  9. 安卓增删改查用sql语句号码_详解Android中一些SQLite的增删改查操作
  10. 极速办公(word)字体如何设置为斜体
  11. copy的过去式_[copy是什么意思中文翻译成]copy是什么意思中文翻译
  12. PDM中BOM管理技术的研究及其应用
  13. java计算机毕业设计文档资料管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  14. java判断线与矩形相交_判断任意多边形与矩形的相交(线段与矩形相交或线段与线段相交)...
  15. 树莓派3强大很多--相比树莓派2
  16. 电商核心业务功能测试分析
  17. 【华人学者风采】魏少军 清华大学
  18. attempting to bokeyaunrun eclipse useing the jre instead of jdk,to run eclipse using
  19. intellij idea处理xml文件File encoding is disabled,Encoding is hard-coded in the text.提示的方法
  20. GetAsyncKeyState()用法

热门文章

  1. 取消回车表单自动提交
  2. 设计模式 经典书籍必备推荐
  3. chrome http请求,测试webapp接口之DHC - REST/HTTP API Client
  4. html中h标签可包含a标签,HTML中H标签P标签(Paragraph)img标签(image)a标签(anchor)
  5. ruby mysql dbi_Ruby/DBI-数据库访问接口
  6. python 结构体数组_关于python:将结构化数组转换为常规NumPy数组
  7. 为什么大部分人会碌碌无为?
  8. 25岁,欠债47万怎么办
  9. 利用cli.go来写命令行应用
  10. Apache目录介绍