<1>已知二叉树的前序序列和中序序列,求解树。
1、确定树的根节点。树根是当前树中所有元素在前序遍历中最先出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点
边和右边都为空,则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。
<2>、已知二叉树的后序序列和中序序列,求解树。
1、确定树的根。树根是当前树中所有元素在后序遍历中最后出现的元素。
2、求解树的子树。找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树。若根节点左边或右边为空,则该方向子树为空;若根节点
边和右边都为空,则根节点已经为叶子节点。
3、递归求解树。将左子树和右子树分别看成一棵二叉树,重复1、2、3步,直到所有的节点完成定位。
参考来自:http://blog.youkuaiyun.com/sjf0115/article/details/8649008
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
char data;
struct node *lchild,*rchild;
}BiTNode,*BiTree;
void pro_mid_createBiTree(BiTree &T,char *last,char *mid,int len)//后序中序还原建立二叉树
{
if(len==0)
{
T=NULL;
return ;
}
char ch = last[len-1]; //取得后序遍历顺序中最后一个结点
int index = 0;//在中序序列中进行查找根结点,并用index记录其在序列中的索引
while(mid[index]!=ch)//在中序中找到的所有结点的左边为该结点的左子树,右边为右子树
{
index++;
}
T=(BiTNode *)malloc(sizeof(BiTNode ));
T->data = ch;
pro_mid_createBiTree(T->lchild,last,mid,index);//建立左子树
pro_mid_createBiTree(T->rchild,last+index,mid+index+1,len-index-1);//建立右子树
}
void pre_mid_createBiTree(BiTree &T,char *prim,char *mid,int len) //前序中序还原建立二叉树
{
if(len==0)
{
T=NULL;
return ;
}
char ch = prim[0]; //找到先序中的第一个结点
int index =0;
while(mid[index]!=ch)//在中序中找到的所有结点的左边为该结点的左子树,右边为右子树
{
index++;
}
T=(BiTNode *)malloc(sizeof(BiTNode ));
T->data = ch;
pre_mid_createBiTree(T->lchild,prim+1,mid,index);//建立左子树
pre_mid_createBiTree(T->rchild,prim+index+1,mid+index+1,len-index-1);//建立右子树
}
void pre_order(BiTree T)//前序递归遍历二叉树
{
if(T)
{
cout<<T->data;
pre_order(T->lchild);
pre_order(T->rchild);
}
}
void pro_order(BiTree T)//后序递归遍历二叉树
{
if(T)
{
pro_order(T->lchild);
pro_order(T->rchild);
cout<<T->data;
}
}
int main()
{
BiTree T;
int n;
char prim[100],mid[100],last[100];
while(cin>>n)
{
cout<<"前序中序建立二叉树后序输出:"<<endl;
for(int i =0 ;i<n;i++)
{
cin>>prim[i];
}
for(int i =0 ;i<n;i++)
{
cin>>mid[i];
}
pre_mid_createBiTree(T,prim,mid,n);
pro_order(T);
cout<<endl;
cout<<"后序中序建立二叉树前序输出:"<<endl;
for(int i =0 ;i<n;i++)
{
cin>>last[i];
}
for(int i =0 ;i<n;i++)
{
cin>>mid[i];
}
pro_mid_createBiTree(T,last,mid,n);
pre_order(T);
cout<<endl;
}
return 0;
}