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 }