由中序遍历 分别和前序遍历,后序遍历进行建树的方法:
// 由中序和后序遍历序列进行建树, 返回根结点指针
Node * InPostCreateTree(int *mid,int *post,int len){
if(len == 0)
return NULL;
int i=len-1;
while(post[len-1] != mid[i])
--i;
Node *h=NewNode();
h->data=post[len-1];
h->left=InPostCreateTree(mid,post,i);
h->right=InPostCreateTree(mid+i+1,post+i,len-i-1);
return h;
}
// 由前序和中序遍历序列进行建树, 返回根结点的指针
Node * PreInCreateTree(int *mid,int *pre,int len) //n标识s2的长度
{
if(len==0)
return NULL;
int i = 0;
while(*mid != pre[i])
++i;
Node *h=NewNode();
h->data= *mid;
h->left = PreInCreateTree(mid+1, pre, i);
h->right = PreInCreateTree(mid+i+1, pre+i+1, len-i-1);
return h;
}
// 由中序和后序遍历序列进行建树, 返回根结点指针
Node * InPostCreateTree(int *mid,int *post,int len){
if(len == 0)
return NULL;
int i=len-1;
while(post[len-1] != mid[i])
--i;
Node *h=NewNode();
h->data=post[len-1];
h->left=InPostCreateTree(mid,post,i);
h->right=InPostCreateTree(mid+i+1,post+i,len-i-1);
return h;
}
// 由前序和中序遍历序列进行建树, 返回根结点的指针
Node * PreInCreateTree(int *mid,int *pre,int len) //n标识s2的长度
{
if(len==0)
return NULL;
int i = 0;
while(*mid != pre[i])
++i;
Node *h=NewNode();
h->data= *mid;
h->left = PreInCreateTree(mid+1, pre, i);
h->right = PreInCreateTree(mid+i+1, pre+i+1, len-i-1);
return h;
}