思路:以前序找中序的根的位置,然后划分中序中左右子树的序列,然后根据序列长度找到前序中左右子树的划分,然后递归建树即可。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.empty()|vin.empty()) return NULL;//终止条件
int vini = 0;
int vinj = pre.size()-1;
int prei = 0;
int prej = pre.size()-1;
int root_value = pre[prei];//保存前序中根的值
TreeNode*root = new TreeNode(root_value);
int root_index = 0;
for(int i=vini;i<=vinj;i++)
{
if(vin[i]==root_value)
{
root_index = i;//找到中序中根的位置
break;
}
}
int delta1 = root_index-1-vini;//计算左右子树的序列长度-1
int delta2 = vinj-root_index-1;
//vin中的划分 left:(vini,root_index-1) right:(root_index+1,vinj)
//delta1 = root_index-1-vini, delta2 = vinj-root_index-1
//pre中的划分 left:(prei+1,prei+1+delta1) right: (prej-delta2,prej)
vector<int> temp1,temp2,temp3,temp4;//使用四个辅助vector保存划分的结点
for(int i=prei+1;i<=prei+1+delta1;i++) temp1.push_back(pre[i]);
for(int i=vini;i<=root_index-1;i++) temp2.push_back(vin[i]);
for(int i=prej-delta2;i<=prej;i++) temp3.push_back(pre[i]);
for(int i=root_index+1;i<=vinj;i++) temp4.push_back(vin[i]);
root->left = reConstructBinaryTree(temp1,temp2);//递归建树
root->right = reConstructBinaryTree(temp3,temp4);
return root;
}
};