分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

题目出处

题意:输入两组数据,分别是前序遍历序列和中序遍历序列,你需要编写程序通过这两组数据求出该树的后序遍历序列(前序序列 + 中序序列 = 后序序列

解法:递归

题目分析:

可以先按照用笔和纸的形式去推导出后序序列。推导过程省略,在推导过程中我们会发现规律:

假设 前序序列是 A B E H F C G I

中序序列是 H E B F A C I G (图如下)

每一次从前序序列里,按顺序抽取出字母就能将中序序列分割,并根据中序遍历的特性。分割后的两部分分别是 左子树右子树(注意,他们也是二叉树!)

就像这样:取A, 中序序列被分割为 左子树:H E B F  右子树 C I G

继续取B,但是这次是对左子树:H E B F 进行分割。 分割结果是: 左子树:H E  右子树  B F

直到不能再分割,递归会返回去到第一次使用 A 分割出来的 右子树 里继续分割

上述整个过程都是递归,所以结合代码和用纸笔画一次会更好理解

代码:

#include <stdio.h>#include <stdlib.h>typedef struct TreeNode{ char    data; struct TreeNode   *lchild; struct TreeNode   *rchild;} Node, *PNode;char     preorder[28];   //存放前序序列char     infix[28];  //存放中序序列char    *Pr;void build(char *in, char *pr, PNode *tr);void postordertraversal(PNode T);int main(){ //先建树、再后序遍历输出 PNode    T;  while(scanf("%s %s", &preorder[1], &infix[1]) == 2) {  build(&infix[1], &preorder[1], &T);  postordertraversal(T);  printf("\n"); } return    0;}void build(char *in, char *pr, PNode *tr){ char    *p = in; Pr = pr; if (*in == 0) {  *tr = NULL;  return; } while (1) {  if (*in == *Pr)  {   (*tr) = (PNode)malloc(sizeof(Node));   (*tr)->data = *Pr;   *in = 0;   break;  }  in++; } Pr = Pr + 1; build(p, Pr, &(*tr)->lchild); build(in+1, Pr, &(*tr)->rchild);}void postordertraversal(PNode T){ if (T == NULL)  return; postordertraversal(T->lchild); postordertraversal(T->rchild); printf("%c", T->data);}

这份代码有些东西需要注意:

  • 这里使用到指针,其实可以不使用指针的,下面介绍的更精巧的解法就是用下标的。能尽量不用指针就尽量不用
  • 注意指向指针的指针在这里的作用,这里有讲解

上面的解法是比较直接容易想到的,所以代码没有很精巧。而这里有份更好的解法!

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

poj 2255 Tree Recovery 解题报告相关推荐

  1. POJ 2255 Tree Recovery(已知前序中序,求后序)

    1. 题目链接:http://poj.org/problem?id=2255 2. 题目大意: 给定二叉树的前序和中序序列,输出其后序序列 3. 思考过程: 4. AC代码 /*** @descrip ...

  2. POJ 2255 Tree Recovery 二叉树恢复

    一道和Leetcode的一道题目基本上一样的题目. 给出前序遍历和中序遍历序列,要求依据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出. Leetcode上有给出后序和中序,恢复二叉树的. 只是 ...

  3. poj 2255 Tree Recovery

    #include <iostream> //给出先序和中序遍历序列,输出后序遍历序列#include <string.h>using namespace std;const i ...

  4. POJ 2800 垂直直方图 解题报告

    POJ 2800 垂直直方图 解题报告 编号:2800   考查点:简单计算题 思路: 用gets()读入4行数据,然后按字符统计,显示的时候有点小处理即可. 提交情况: 感觉POJ的测试数据有点骗人 ...

  5. 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)

    [LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...

  6. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

    http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何求 ...

  7. POJ 1797 Heavy Transportation 解题报告

    分类:图论,生成树,最短路,并查集 作者:ACShiryu 时间:2011-7-28 地址:ACShiryu's Blog Heavy Transportation Time Limit: 3000M ...

  8. poj 2182 Lost Cows 解题报告

    题意:每个奶牛都有一个编号,1- N 从第二个牛开始给出前面比她编号小的牛的个数,问你求牛的编号序列 解题思路:线段树+ 二分查找 (多个相同的数二分边界问题需要注意) 解题代码: 1 #includ ...

  9. POJ 2977 生理周期 解题报告

    2977 : 生理周期 总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高 ...

最新文章

  1. 实例化Layout中的布局文件(xml)
  2. index.html文件作用,MEAN JS – 主要的html文件(index.html)位于何处
  3. luogu2839 [国家集训队]middle
  4. ARM 虚拟化技术简介
  5. stick和stuck的区别_怎样区别“stick to”、“stick with”和“stick by”这三个表达?...
  6. JS实现的一个验证码,可以在前端验证后在提交action
  7. 编译器为C++ 空类自动生成的成员函数
  8. WinRAR去除广告
  9. Google Earth Engine APPS(GEE)—— Landsat 数据的时间序列分析来监测森林转化和退化 (CODED)整体框架(万字长文)
  10. 分享按钮-新浪微博开放平台
  11. execute immediate
  12. vue将文件/图片批量打包下载
  13. CSS3-设置基本边框和背景
  14. Latex的pdf合并
  15. 甘肃省国家沙漠公园功能区划及分布
  16. HTML实现简单的网页设计。
  17. 计算各种面值人民币张数
  18. 360扩展中心没有idm了_媒体中心扩展器和Xbox 360
  19. DNS域名服务器114.114.114.114和8.8.8.8
  20. ipad更新9.0系统更新服务器,iPhone/iPad升级iOS9出现卡顿的原因及解决办法

热门文章

  1. [课程相关]homework-06
  2. linux vue node占用内存过大,vue 大型应用内存泄漏改造经验
  3. php mysql 单例模式_PHP单例模式_PHP单例模式数据库连接类
  4. java linearlayout_LinearLayout属性用法和源码分析
  5. Linux|CentOS下配置Maven环境
  6. No field gDefault in class Landroid/app/ActivityManagerNative
  7. Android studio 报错:Manifest merger failed xxx
  8. Android 自定义环形圆形显示统计数据z
  9. 教程-上传应用公钥并获取支付宝公钥
  10. [HAOI2016]食物链