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
原创粉丝点击