已知二叉树的前序,中序,后序遍历中的两个,求另一个
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;
}
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;
}
相关文章推荐
- 已知二叉树先序、中序(中序、后序)遍历序列,输出后序(先序)遍历序列
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 已知先序遍历和中序遍历,求后序遍历 && 求二叉树中节点的最大距离
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 已知前序遍历序列和中序遍历序列,求二叉树的后序遍历
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 【树】已知二叉树前序和中序遍历求后序遍历,及中序和后序遍历求前序遍历
- 已知二叉树的中序和后序遍历排列,求前序遍历
- 二叉树已知前序遍历和中序遍历,编程求后序遍历。
- 已知二叉树的先序遍历(preorder)和中序遍历(inorder) 或 中序和后序(postorder),还原该二叉树
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 已知二叉树前序、后序遍历如何求中序
- 已知一棵二叉树的后序遍历和中序遍历,写出可以确定这棵二叉树的算法
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- 已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- LeetCode 106. 已知中序和后序遍历构建二叉树
- hdu1710 已知二叉树的前序遍历和中序遍历,还原二叉树,求出后序、层次遍历
- 计算机技术——已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?