已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧相关的知识,希望对你有一定的参考价值。
数据结构树的遍历
/* 树中已知先序和中序求后序。如先序为:abdc,中序为:bdac .
则程序可以求出后序为:dbca 。此种题型也为数据结构常考题型。
算法思想:先序遍历树的规则为中左右,则说明第一个元素必为树的根节点,比如上例
中的a就为根节点,由于中序遍历为:左中右,再根据根节点a,我们就可以知道,左子树包含
元素为:db,右子树包含元素:c,再把后序进行分解为db和c(根被消去了),然后递归的
进行左子树的求解(左子树的中序为:db,后序为:db),递归的进行右子树的求解(即右
子树的中序为:c,后序为:c)。如此递归到没有左右子树为止。
关于“已知先序和后序求中序”的思考:该问题不可解,因为对于先序和后序不能唯一的确定
中序,比如先序为 ab,后序为ba,我只能知道根节点为a,而并不能知道b是左子树还是右子树
,由此可见该问题不可解。当然也可以构造符合中序要求的所有序列。
*/
#include <stdio.h>
#include <string.h>
int find(char c,char A[],int s,int e) /**//* 找出中序中根的位置。 */
int i;
for(i=s;i<=e;i++)
if(A[i]==c) return i;
/**//* 其中pre[]表示先序序,pre_s为先序的起始位置,pre_e为先序的终止位置。 */
/**//* 其中in[]表示中序,in_s为中序的起始位置,in_e为中序的终止位置。 */
/**//* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]构成的后序序列。 */
void pronum(char pre[],int pre_s,int pre_e,char in[],int in_s,int in_e)
char c;
int k;
if(in_s>in_e) return ; /**//* 非法子树,完成。 */
if(in_s==in_e)printf("%c",in[in_s]); /**//* 子树子仅为一个节点时直接输出并完成。 */
return ;
c=pre[pre_s]; /**//* c储存根节点。 */
k=find(c,in,in_s,in_e); /**//* 在中序中找出根节点的位置。 */
pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /**//* 递归求解分割的左子树。 */
pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /**//* 递归求解分割的右子树。 */
printf("%c",c); /**//* 根节点输出。 */
void main()
char pre[]="abdc";
char in[]="bdac";
printf("The result:");
pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1);
getchar();
参考资料:http://bidlcy514.blog.163.com/blog/static/1054919432010420103312168/
参考技术A 1. 根据前序序列的第一个元素建立根结点;2. 在中序序列中找到该元素,确定根结点的左右子树的中序序列;
3. 在前序序列中确定左右子树的前序序列;
4. 由左子树的前序序列和中序序列建立左子树;
5. 由右子树的前序序列和中序序列建立右子树
这样递归下去,当取完中序序列中的节点时,就可以得到一颗二叉树。
然后再根据后序遍历,得到你所需要的二叉树。 参考技术B 已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C 的,要在TC环境下能运行的,各位能人帮帮忙吧
开机喜事到,向您问个好,办事处处顺,生活步步高,彩票期期中,好运天天交,打牌场场胜,口味顿顿2好,越活越年轻。
已知二叉树的先序遍历序列和中序遍历序列,求后序遍历序列。
思路:
先序序列的第一个结点为要构造二叉树的根结点,在中序序列中查找二叉树的根结点,则中序列根结点左边为根结点的左子树的中序序列,右边为根结点的右子树的中序序列。而先序序列根结点后面分别为它的左子树和右子树的先序序列。有了根结点在中序序列的位置,就知道了左子树和右子树的先序序列各自的位置。这样,就知道了根结点两个子树的序列。
然后在构造了根结点后,就可以递归调用函数来勾结根结点的左子树和右子树。
以上为二叉树的恢复。
后序遍历二叉树也是用递归即可。
代码如下:
string.find() 返回查找元素的下标
string.substr(a, b) 从第a个下标的元素开始截取b个元素
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
struct Node
{
char data;
Node * lchild;
Node * rchild;
};
Node* CreatTree(string pre, string in)
{
Node * root = NULL; //树的初始化
if(pre.length() > 0)
{
root = new Node; //为根结点申请结构体所需要的内存
root->data = pre[0]; //先序序列的第一个元素为根结点
int index = in.find(root->data); //查找中序序列中的根结点位置
root->lchild = CreatTree(pre.substr(1, index), in.substr(0, index)); //递归创建左子树
root->rchild = CreatTree(pre.substr(index + 1), in.substr(index + 1)); //递归创建右子树
}
return root;
}
void PostOrder(Node * root) //递归后序遍历
{
if(root != NULL)
{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data;
}
}
int main()
{
string pre_str, in_str;
Node *root;
while(cin>>pre_str>>in_str)
{
root = CreatTree(pre_str, in_str);
PostOrder(root);
cout<<endl;
}
return 0;
}
以上是关于已知二叉树的先序序列和中序序列怎么求后序序列?不是基于C++的,要在TC环境下能运行的,各位能人帮帮忙吧的主要内容,如果未能解决你的问题,请参考以下文章
已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列