poj2255~~Tree Recovery (树的遍历构造~)
来源:互联网 发布:菠菜网源码 编辑:程序博客网 时间:2024/05/09 01:00
题意:给出二叉树的前序遍历和中序遍历,求它的后序遍历
思路:
我先给出一个二叉树做例子,告诉你整个算法的原理和过程。
对于这棵树,它的前序遍历应该是:ABDECFG,中序遍历是DBEAFCG,后续遍历是DEBFGCA(不清楚的翻翻你的数据结构书)
主要思想:前序遍历的作用就是找根节点,中序用来找根的位置来确定左右子树!然后把根放进后序的最后
对于以A为根的这棵树,他是前序遍历中第一个碰到的,所以它必定是根,而根肯定是后序遍历中排在最后的,所以这时可以提出A放在后序遍历的最后一个。
而在中序遍历中,A的左边是它的左子树(DBE),A的右边是它的右子树(FCG),所以要找到A的位置,
int p=strchr(s2,s1[0])-s2; //找到根节点在中序遍历中的位置
然后分解成两棵树继续按照同样的方法求,n指这颗树的度
左子树的前序遍历就是BDE,所以赋予s1+1即可,用s2找它出现的位置已经够了,即计算p在左子树的值
build(p,s1+1,s2,s); //递归构造左子树的后序遍历
柚子树的前序遍历是CFG,所以要变成s1+p+1,然后找位置自然也要s2+p+1,放进后序遍历的后面的部分。就是s+p
build(p,s1+1,s2,s); //递归构造左子树的后序遍历
这样子一次次把根的节点照出来放到后序遍历的数组里,最后输出就是答案了!
#include<iostream>#include<string>using namespace std;void build(int n,char *s1,char *s2,char *s){if(n<=0) return ;int p=strchr(s2,s1[0])-s2; //找到根节点在中序遍历中的位置build(p,s1+1,s2,s); //递归构造左子树的后序遍历build(n-p-1,s1+p+1,s2+p+1,s+p); //递归构造右子树的后序遍历//柚子~我想起了柚子的潘森s[n-1]=s1[0]; //把根节点添加到最后}int main(){char pre[30],in[30],post[30];while(scanf("%s%s",pre,in)!=EOF){intn=strlen(pre);build(n,pre,in,post);post[n]='\0'; //不要忘了字符串结束的标志!printf("%s\n",post);}}
0 0
- poj2255~~Tree Recovery (树的遍历构造~)
- POJ2255 Tree Recovery 【树的遍历】
- poj2255 Tree Recovery 二叉树遍历
- POJ2255 Tree Recovery 二叉树遍历
- POJ2255 Tree Recovery(二叉树遍历)
- POJ2255,Tree Recovery,二叉树重建
- poj2255- Tree Recovery(二叉树)
- POJ2255 Tree Recovery
- poj2255 Tree Recovery
- poj2255 Tree Recovery
- POJ2255-Tree Recovery
- poj2255 Tree Recovery(递归)
- POJ2255----Tree Recovery
- POJ2255-Tree Recovery 已知先序遍历和中序遍历求后序遍历
- poj2255 Tree Recovery 二叉树,这题整我好惨
- poj2255——Tree Recovery(应用二叉树)
- POJ2255 Tree Recovery 前序 中序求后序
- POJ2255 Tree Recovery (先序中序-》后序)
- fzu 2150 Fire Game_(bfs)
- 今日有感,随笔而写
- 七月二十四新
- 最初的window
- Svn创建本地仓库
- poj2255~~Tree Recovery (树的遍历构造~)
- DG实验
- udf (MapObjectInspector的使用)
- 链表的反转
- JavaSE知识点
- Xcode中文件名旁边的小标记的作用
- linux中fork()与vfork()的区别
- URAL 1748 The Most Complex Number 深度优先搜索 反素数
- 链表的倒数第K个数