void Rebuild(char *pPreOrder , char *pInOrder , Node **pRoot , int nTreeLen)
{
int nLeftLen , nRightLen;
char *pLeftEnd;
Node *p;
//边界条件检查
if(!pPreOrder || !pInOrder || !pRoot) return;
if(!(p = (Node *)malloc(sizeof(Node)))) return;
p->chValue = *pPreOrder;
p->lChild = p->rChild = NULL;
*pRoot = p;
if(nTreeLen == 1) return;
//划分左右子数
pLeftEnd = pInOrder;
while(*pLeftEnd != *pPreOrder) pLeftEnd++;
nLeftLen = (int)(pLeftEnd - pInOrder);
nRightLen = nTreeLen - nLeftLen - 1;
if(nLeftLen)
Rebuild(pPreOrder + 1 , pInOrder , &(p->lChild) , nLeftLen);
if(nRightLen)
Rebuild(pPreOrder + nLeftLen + 1, pInOrder + nLeftLen + 1 , &(p->rChild) , nRightLen);
}