递归:
利用二叉树的特性,先序遍历的顺序是父结点,左子树,右子树,
中序遍历的顺序是,左子树,父结点,右子树,如此先序遍历的数组的第一个数字,就是中序遍历数组的中间某个数字,
并且这个数字将中序遍历数组一分为二,左边为左子树,右边为右子树,如此,我们只需要一个 hash map 存储中序遍历数组的每一个值的下标,
就可以快速定位中序遍历数组的父节点位置,快速区分左右子树
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int len = preorder.size();
for (int i = 0; i < len; ++i) {
index[inorder[i]] = i;
}
return build(preorder, inorder, 0, len - 1, 0, len - 1);
}
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right) {
if (pre_left > pre_right) return nullptr;
TreeNode* root = new TreeNode(preorder[pre_left]);
int in_left_size = index[preorder[pre_left]] - in_left;
root->left = build(preorder, inorder, pre_left + 1, pre_left + in_left_size, in_left, index[preorder[pre_left]] - 1);
root->right = build(preorder, inorder, pre_left + in_left_size + 1, pre_right, index[preorder[pre_left]] + 1, in_right);
return root;
}
private:
std::unordered_map<int, int> index;
};