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 }