1 #include <iostream> 2 3 using namespace std; 4 5 const int TREELEN=6; 6 7 typedef struct NODE 8 { 9 char chVal; 10 struct NODE* pLeft; 11 struct NODE* pRight; 12 }NODE; 13 14 void rebuild(char *pPreOrder, char *pInOrder, int treeLen, NODE **pRoot) 15 { 16 //前序中序序列为空,返回NULL,失败 17 if(pPreOrder == NULL || pInOrder == NULL) 18 { 19 return ; 20 } 21 22 NODE *pTemp =new NODE; 23 pTemp->chVal = *pPreOrder; 24 pTemp->pLeft = NULL; 25 pTemp->pRight = NULL; 26 27 if(*pRoot == NULL) 28 { 29 *pRoot = pTemp; 30 } 31 32 //only have one node return; 33 if(treeLen == 1) 34 { 35 return; 36 } 37 38 int tempLen = 0; 39 char *leftEnd = pInOrder; 40 41 while(*leftEnd != *pPreOrder) 42 { 43 if(leftEnd == NULL || pPreOrder ==NULL) 44 { 45 return; 46 } 47 tempLen++; 48 //in case that overflow 49 if(tempLen > treeLen) 50 { 51 return; 52 } 53 leftEnd++; 54 } 55 int nLeftLen = tempLen; 56 int nRightLen = treeLen - 1 - tempLen; 57 if(nLeftLen>=1) 58 { 59 rebuild(pPreOrder+1, pInOrder, nLeftLen, &((*pRoot)->pLeft)); 60 } 61 if(nRightLen>=1) 62 { 63 rebuild(pPreOrder+nLeftLen+1, leftEnd+1, nRightLen, &((*pRoot)->pRight)); 64 } 65 } 66 67 void preOrderTreval(NODE *pRoot) 68 { 69 if(pRoot==NULL) 70 { 71 return; 72 } 73 cout<<pRoot->chVal<<" "; 74 preOrderTreval(pRoot->pLeft); 75 preOrderTreval(pRoot->pRight); 76 } 77 int main() 78 { 79 char szPreOrder[TREELEN] = {'a', 'b', 'd', 'c', 'e', 'f'}; 80 char szInOrder[TREELEN] = {'d', 'b', 'a', 'e', 'c', 'f'}; 81 82 NODE *pRoot = NULL; 83 rebuild(szPreOrder, szInOrder, TREELEN, &pRoot); 84 preOrderTreval(pRoot); 85 return 0; 86 }
![](https://img2024.cnblogs.com/blog/35695/202407/35695-20240713070336838-1837943664.jpg)