- #include<iostream>
- using namespace std;
- #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)
- {
- return;
- }
- //获得前序遍历的第一个节点
- NODE* pTemp = new NODE;
- pTemp->chValue = *pPreOrder;
- pTemp->pLeft = NULL;
- pTemp->pRight = NULL;
- //如果节点为空,把当前节点复制到根节点
- if(*pRoot == NULL)
- {
- *pRoot = pTemp;
- }
- //如果当前树长度为1,那么已经是最后一个节点
- if(nTreeLen == 1)
- {
- return;
- }
- //寻找子树长度
- char* pOrgInOrder = pInOrder;
- char* pLeftEnd = pInOrder;
- int nTempLen = 0;
- //找到左子树的结尾
- while(*pPreOrder != *pLeftEnd)
- {
- if(pPreOrder==NULL || pLeftEnd==NULL)
- {
- return;
- }
- nTempLen++;
- //记录临时长度,以免溢出
- if(nTempLen > nTreeLen)
- {
- break;
- }
- pLeftEnd++;
- }
- //寻找左子树长度
- int nLeftLen = 0;
- nLeftLen = (int)(pLeftEnd-pOrgInOrder);
- //寻找右子树长度
- int nRightLen = 0;
- nRightLen = nTreeLen - nLeftLen - 1;
- //重建左子树
- if(nLeftLen > 0)
- {
- ReBuild(pPreOrder+1,pInOrder,nLeftLen,&((*pRoot)->pLeft));
- }
- //重建右子树
- if(nRightLen > 0)
- {
- ReBuild(pPreOrder+nLeftLen+1,pInOrder+nLeftLen+1,nRightLen,&((*pRoot)->pRight));
- }
- }
- //前序遍历结果
- void PrePrint(NODE* pRoot)
- {
- if(pRoot == NULL)
- {
- return;
- }
- cout<<pRoot->chValue<<" ";
- PrePrint(pRoot->pLeft);
- PrePrint(pRoot->pRight);
- }
- //中序遍历结果
- void InPrint(NODE* pRoot)
- {
- if(pRoot == NULL)
- {
- return;
- }
- InPrint(pRoot->pLeft);
- cout<<pRoot->chValue<<" ";
- InPrint(pRoot->pRight);
- }
- void main()
- {
- char szPreOrder[TREELEN] = {'a','b','d','c','e','f'};
- char szInOrder[TREELEN] = {'d','b','a','e','c','f'};
- NODE* pRoot = NULL;
- ReBuild(szPreOrder,szInOrder,TREELEN,&pRoot);
- PrePrint(pRoot);
- cout<<endl<<endl;;
- InPrint(pRoot);
- cout<<endl;
- }
- /*
- a b d c e f
- d b a e c f
- */