poj 2255 Tree Recovery 解题报告
分享一下我老师大神的人工智能教程!零基础,通俗易懂!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 解题报告相关推荐
- POJ 2255 Tree Recovery(已知前序中序,求后序)
1. 题目链接:http://poj.org/problem?id=2255 2. 题目大意: 给定二叉树的前序和中序序列,输出其后序序列 3. 思考过程: 4. AC代码 /*** @descrip ...
- POJ 2255 Tree Recovery 二叉树恢复
一道和Leetcode的一道题目基本上一样的题目. 给出前序遍历和中序遍历序列,要求依据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出. Leetcode上有给出后序和中序,恢复二叉树的. 只是 ...
- poj 2255 Tree Recovery
#include <iostream> //给出先序和中序遍历序列,输出后序遍历序列#include <string.h>using namespace std;const i ...
- POJ 2800 垂直直方图 解题报告
POJ 2800 垂直直方图 解题报告 编号:2800 考查点:简单计算题 思路: 用gets()读入4行数据,然后按字符统计,显示的时候有点小处理即可. 提交情况: 感觉POJ的测试数据有点骗人 ...
- 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)
[LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...
- Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)
http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何求 ...
- POJ 1797 Heavy Transportation 解题报告
分类:图论,生成树,最短路,并查集 作者:ACShiryu 时间:2011-7-28 地址:ACShiryu's Blog Heavy Transportation Time Limit: 3000M ...
- poj 2182 Lost Cows 解题报告
题意:每个奶牛都有一个编号,1- N 从第二个牛开始给出前面比她编号小的牛的个数,问你求牛的编号序列 解题思路:线段树+ 二分查找 (多个相同的数二分边界问题需要注意) 解题代码: 1 #includ ...
- POJ 2977 生理周期 解题报告
2977 : 生理周期 总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高 ...
最新文章
- 实例化Layout中的布局文件(xml)
- index.html文件作用,MEAN JS – 主要的html文件(index.html)位于何处
- luogu2839 [国家集训队]middle
- ARM 虚拟化技术简介
- stick和stuck的区别_怎样区别“stick to”、“stick with”和“stick by”这三个表达?...
- JS实现的一个验证码,可以在前端验证后在提交action
- 编译器为C++ 空类自动生成的成员函数
- WinRAR去除广告
- Google Earth Engine APPS(GEE)—— Landsat 数据的时间序列分析来监测森林转化和退化 (CODED)整体框架(万字长文)
- 分享按钮-新浪微博开放平台
- execute immediate
- vue将文件/图片批量打包下载
- CSS3-设置基本边框和背景
- Latex的pdf合并
- 甘肃省国家沙漠公园功能区划及分布
- HTML实现简单的网页设计。
- 计算各种面值人民币张数
- 360扩展中心没有idm了_媒体中心扩展器和Xbox 360
- DNS域名服务器114.114.114.114和8.8.8.8
- ipad更新9.0系统更新服务器,iPhone/iPad升级iOS9出现卡顿的原因及解决办法
热门文章
- [课程相关]homework-06
- linux vue node占用内存过大,vue 大型应用内存泄漏改造经验
- php mysql 单例模式_PHP单例模式_PHP单例模式数据库连接类
- java linearlayout_LinearLayout属性用法和源码分析
- Linux|CentOS下配置Maven环境
- No field gDefault in class Landroid/app/ActivityManagerNative
- Android studio 报错:Manifest merger failed xxx
- Android 自定义环形圆形显示统计数据z
- 教程-上传应用公钥并获取支付宝公钥
- [HAOI2016]食物链