前序 a b d c e f
中序 d b a e c f
重建二叉树,并打印后续 d b e f c a
#include <stdio.h>
#include <stdlib.h>
#define TREELEN 6
struct NODE{
NODE* pLeft;
NODE* pRight;
char chValue;
};
void Rebuild(char* pPreOrder,char* pInOrder,int nTreeLen,NODE** pRoot){
if(pPreOrder==NULL||pInOrder==NULL||pRoot==NULL)
return;
NODE* tmp=new NODE;
tmp->chValue=*pPreOrder;
tmp->pLeft=NULL;
tmp->pRight=NULL;
//构造第一个根节点
if(*pRoot==NULL)
*pRoot=tmp;
if(nTreeLen==1)
return;
char* pLeftEnd=pInOrder;
//第二种计算方法会用到
char* pOrgInOrder=pInOrder;
int nTempLen=0;
while(*pPreOrder != *pLeftEnd){
//这里可能有问题;
pLeftEnd++;
nTempLen++;
}
int leftTreeLen=0,rightTreeLen=0;
// leftTreeLen=int(pLeftEnd-pOrgInOrder); 两种计算方法
// rightTreeLen=nTreeLen-leftTreeLen-1;
leftTreeLen=nTempLen;
rightTreeLen=nTreeLen-nTempLen-1;
if(leftTreeLen>0){
Rebuild(pPreOrder+1,pInOrder,leftTreeLen,&((*pRoot)->pLeft));
}
if(rightTreeLen>0){
Rebuild(pPreOrder+leftTreeLen+1,pInOrder+leftTreeLen+1,rightTreeLen,&((*pRoot)->pRight));
}
}
void PostOrder(NODE *p)
{
if(p)
{
PostOrder(p->pLeft);
PostOrder(p->pRight);
printf("%c",p->chValue);
}
}
int main(){
char PreOrder[TREELEN]={'a','b','d','c','e','f'};
char InOrder[TREELEN]={'d','b','a','e','c','f'};
NODE* pRoot=NULL;
Rebuild(PreOrder,InOrder,TREELEN,&pRoot);
PostOrder(pRoot);
system("pause");
return 0;
}