题目描述
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { 13 int length = pre.size(); 14 if (length == 0) { 15 return nullptr; 16 } 17 return Construct(pre, vin, 0, length - 1, 0, length - 1); 18 } 19 private: 20 TreeNode* Construct(vector<int> pre, vector<int> vin, int pre_l, int pre_r, 21 int vin_l, int vin_r) { 22 int rootValue = pre[pre_l]; //记录根节点的值 23 TreeNode *root = new TreeNode(rootValue); //创建根节点 24 //如果只有一个值 25 if (pre_l == pre_r) { 26 if (vin_l == vin_r && pre[pre_l] == vin[vin_l]) 27 return root; 28 else 29 return nullptr; 30 } 31 int i = vin_l; //记录根节点的值在中序遍历序列的位置 32 while (i <= vin_r && vin[i] != rootValue) { 33 i++; 34 } 35 int leftlength = i - vin_l; //左子树长度 36 //左子树长度大于零 37 if (leftlength > 0) { 38 root->left = Construct(pre, vin, pre_l + 1, pre_l + leftlength, 39 vin_l, i - 1); 40 } 41 //左子树长度小于传入序列长度-1(除去根节点),说明右子树长度大于零 42 if (leftlength < (pre_r - pre_l)) { 43 root->right = Construct(pre, vin, pre_l + leftlength + 1, pre_r, 44 i + 1, vin_r); 45 } 46 return root; 47 } 48 };