您的位置:首页 > 其它

已知二叉树的前序,中序,后序遍历中的两个,求另一个

2017-08-11 19:21 260 查看
已知有一棵树,知道其前序,中序序列,求后序序列

PreOrder:         GDAFEMHZ

InOrder:            ADEFGHMZ

求得:

PostOrder:       AEFDHZMG

分析:已知先序序列中的先后顺序就是根出现的顺序,因为 先序序列是首先访问根节点,即先从先序序列中找到根节点G,然后到中序序列中找到G,G将中序序列分成了两部分,左边就是该根节点的左子树ADEF,右边就是该根节点的右子树HMZ,然后拿着这两个子树到先序序列中去找左子树DAFE和右子树MHZ,就又能找到左子树的根D和右子树的根M,还是因为先序序列中先访问根,再访问左子树,最后访问右子树。。。。。这样重复操作,知道先序序列遍历完成,说明所有的根都已经找到,那不就结束了嘛。递归实现

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 100;
char pre[maxn],in[maxn];
struct node
{
char element;
};
void treeording(char *pre,char* in,int len)
{
if(len == 0) return;
struct node Node;
Node.element = pre[0];///先找到根节点,是为了后面输出操作
int rootindex = 0;
for(rootindex = 0;rootindex < len;rootindex++)///是为了找到根节点在中序序列中的位置
{
if(in[rootindex] == pre[0])///然后根据位置找到序列的左右端点,方便递归的时候
break;///调用
}
treeording(pre+1,in,rootindex);///三个参数分别是左子树的先序序列的起始位置,中序的起始,左子树的长度
treeording(pre+1+rootindex,in+rootindex+1,len-rootindex-1);///三个参数是右子树的先序的起始,中序的起始和右子树的长度
printf("%c ",Node.element);///左,右子树完成之后,输出根节点的值,符合后序遍历
}
int main(int argc, char *argv[])
{
gets(pre);gets(in);
int len = strlen(pre);
treeording(pre,in,len);
return 0;
}


已知有一棵树,知道其后序,中序序列,求前序序列

PostOrder:       AEFDHZMG

InOrder:            ADEFGHMZ

求得:

PreOrder:         GDAFEMHZ

求前序和上面求后序差不多,但是应该注意,求先序的时候,应该先输出跟节点的值,然后再去处理左,右子树

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 100;
char post[maxn],in[maxn];
struct node
{
char element;
};
void treeording(char *post,char* in,int len)
{
if(len == 0) return;
struct node Node;
Node.element = post[len-1];
int rootindex = 0;
for(rootindex = 0;rootindex < len;rootindex++)
{
if(in[rootindex] == post[len-1])
break;
}
printf("%c ",Node.element);
treeording(post,in,rootindex);
treeording(post+rootindex,in+rootindex+1,len-rootindex-1);
}
int main(int argc, char *argv[])
{
gets(post);gets(in);
int len = strlen(post);
treeording(post,in,len);
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐