- 根据前序遍历序列得到根节点
- 在中序遍历序列中定位根节点,区分开左右子树
- 依据长度划分出左、右子树的前序遍历序列和中序遍历序列,通过递归,分别建立左右子树。
class Solution {
public:
TreeNode* ConstructCore(vector<int> pre, vector<int> vin) {
vector<int>::iterator pre_iterator = pre.begin();
vector<int>::iterator vin_iterator = vin.begin();
int rootValue = *pre_iterator;
TreeNode* root = new TreeNode(0);
root->val = rootValue;
if(pre.size() == 1) {
if(*pre_iterator == *vin_iterator)
return root;
else
return NULL;
}
vector<int>::iterator root_inorder = find(vin.begin(), vin.end(),rootValue);
if(root_inorder == vin.end())
return NULL;
int left_len = root_inorder - vin.begin();
if(left_len > 0) {
vector<int> left_child_pre(pre.begin() + 1, pre.begin() + left_len + 1);
vector<int> left_child_vin(vin.begin(), root_inorder);
root->left = ConstructCore(left_child_pre, left_child_vin);
}
if(left_len + 1 < pre.size()) {
vector<int> right_child_pre(pre.begin() + left_len + 1, pre.end());
vector<int> right_child_vin(root_inorder + 1, vin.end());
root->right = ConstructCore(right_child_pre, right_child_vin);
}
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int pre_len = pre.size();
int vin_len = vin.size();
if(pre_len == 0 || vin_len == 0 || pre_len != vin_len)
return NULL;
return ConstructCore(pre, vin);
}
};