1 #include<iostream>
 2 using namespace std;
 3 
 4 struct BinaryTreeNode {
 5 
 6     int m_nValue;
 7     BinaryTreeNode* m_pLeft;
 8     BinaryTreeNode* m_pRight;
 9 };
10 
11 BinaryTreeNode* constructBinaryTree(int preOrder[], int preBeg, int preEnd,
12                                     int midOrder[], int midBeg, int midEnd) {
13 
14     int value = preOrder[preBeg];
15     BinaryTreeNode* root = new BinaryTreeNode();
16     root->m_nValue = value;
17     root->m_pLeft = root->m_pRight = NULL;
18 
19     if(preBeg == preEnd) {
20         return root;
21     }
22     int i;
23     for(i = midBeg; i < midEnd; i++){//寻找根节点在midOrder中的位置。
24         if(midOrder[i] == value)
25             break;
26     }
27     
28     //确定左子树和右子树的序列
29 
30     int leftLen = i - midBeg;
31     int rightLen = midEnd - i;
32 
33     int leftPreBeg = preBeg +1;
34     int leftPreEnd = preBeg + leftLen;
35     int leftMidBeg = midBeg;
36     int letfMidEnd = i - 1;
37 
38     int rightPreBeg = leftPreEnd + 1;
39     int rightPreEnd = preEnd;
40     int rightMidBeg = i + 1;
41     int rightMidEnd = midEnd;
42 
43     if(leftLen > 0) {
44         root->m_pLeft = constructBinaryTree(preOrder, leftPreBeg, leftPreEnd, midOrder, leftMidBeg, letfMidEnd);
45     }
46 
47     if(rightLen > 0) {
48         root->m_pRight = constructBinaryTree(preOrder, rightPreBeg, rightPreEnd, midOrder, rightMidBeg, rightMidEnd);
49     }
50     return root;
51 }
52 
53 void preOrderPrint(BinaryTreeNode* root) {
54     
55     if(root == NULL)
56         return;
57     cout << root->m_nValue << " ";
58     preOrderPrint(root->m_pLeft);
59     preOrderPrint(root->m_pRight);
60 
61 }
62 
63 void midOrderPrint(BinaryTreeNode* root) {
64 
65     if(root == NULL)
66         return;
67     midOrderPrint(root->m_pLeft);
68     cout << root->m_nValue << " ";
69     midOrderPrint(root->m_pRight);
70 }
71 
72 int main() {
73     
74     int preOrder[8] = {1,2,4,7,3,5,6,8};
75     int midOrder[8] = {4,7,2,1,5,3,8,6};
76 
77 
78     BinaryTreeNode *root = constructBinaryTree(preOrder, 0, 7, midOrder, 0, 7);
79     preOrderPrint(root);
80     cout << endl;
81     midOrderPrint(root);
82 }