前提所需
//树节点
struct BiNode
{
int data;
BiNode* lchild;
BiNode* rchild;
};
int ino[37];//中序遍历
int know[37];//已知的一个遍历,前或后
//调用
BiNode* bi=BuildTree(0,n-1,0,n-1,ino,know);
已知前序遍历和中序遍历建树
BiNode* BuildTree(int l,int r,int inl,int inr,int ino[],int know[])
{
if(r<l||inr<inl)
return NULL;
BiNode* bi=(BiNode*)malloc(sizeof(BiNode*));
int tpos=inl;
for(tpos=inl;tpos<=inr;tpos++){
if(know[l]==ino[tpos]){
break;
}
}
bi->data=know[l];
bi->lchild=BuildTree(l+1,r-(inr-tpos-1)-1,inl,tpos-1,ino,know);
bi->rchild=BuildTree(r-(inr-tpos-1),r,tpos+1,inr,ino,know);
return bi;
}
已知后序遍历和中序遍历建树
BiNode* BuildTree(int l,int r,int inl,int inr,int ino[],int know[])
{
if(r<l||inr<inl)
return NULL;
BiNode* bi=(BiNode*)malloc(sizeof(BiNode*));
int tpos=inl;
for(tpos=inl;tpos<=inr;tpos++){
if(know[r]==ino[tpos]){
break;
}
}
bi->data=know[r];
bi->lchild=BuildTree(l,l+tpos-1-inl,inl,tpos-1,ino,know);
bi->rchild=BuildTree(l+tpos-inl,r-1,tpos+1,inr,ino,know);
return bi;
}