EricYang

Tech Spot of Eric

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
 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 }
posted on 2012-08-13 22:59  Eric-Yang  阅读(173)  评论(0编辑  收藏  举报