知识点:
先序:中左右
中序:左中右
后序:左右中
#include <iostream>
using namespace std;
typedef struct BiNode{//创建一个结点
int data;
BiNode *lchild;
BiNode *rchild;
}BiNode,*BiTree;
//递归创建二叉树,三个形参
//第一个是储存后序遍历的数组
//第二个是中序遍历的数
//第三个是组数的长度
BiTree Createtree(int *postOrder,int *inOrder,int n)
{
BiTree T;
if(n<=0)
return NULL;
T=new BiNode;
int mid=0;
for(int i=0;i<n;i++)//找到根结点在中序中的位置
{
if(inOrder[i]==postOrder[n-1])
{
mid=i;
break;
}
}
T->data=postOrder[n-1];//后序最后一个结点是树根
T->lchild=Createtree(postOrder,inOrder,mid);//递归创建左子树
T->rchild=Createtree(postOrder+mid,inOrder+mid+1,n-mid-1);//递归创建右子树
return T;
}
int flag=0;
void prePrint(BiTree T) //先序遍历的递归方法
{
if(!T)
return;
if(!flag)
{
cout<<T->data;//访问第一个不加空格
flag=1;
}
else
cout<<" "<<T->data;
prePrint(T->lchild);
prePrint(T->rchild);
}
int main() {
int n;
BiTree T;
cin>>n;
int postOrder[n];//放后序遍历
int inOrder[n];//放中序遍历
for(int i=0;i<n;i++)
{
cin>>postOrder[i];
}
for(int i=0;i<n;i++)
{
cin>>inOrder[i];
}
T=Createtree(postOrder,inOrder,n);//创建二叉树
cout<<"Preorder: ";
prePrint(T);//先序遍历二叉树的递归函数
return 0;
}