题目
剑指 Offer 07. 重建二叉树
解析
- 确定中序遍历中头节点位置
index
- 计算左子树长度
size = index - inl,inl为中序遍历的起点
- 构建左子树
前序遍历位置:[prel + 1, prel + size]
中序遍历位置:[inl, index - 1]
- 构建右子树
前序遍历位置:[prel + size + 1, prer]
中序遍历位置:[index + 1, inr]
代码
class Solution {
public:
unordered_map<int, int> pos;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for (int i = 0; i < n; i++) {
pos[inorder[i]] = i;
}
return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
}
TreeNode* dfs(vector<int>& preorder, vector<int>& inorder, int prel, int prer, int inl, int inr) {
if(prel > prer)
return NULL;
//获取中序遍历根节点位置
int index = pos[preorder[prel]];
//计算左子树长度
int size = index - inl;
TreeNode* root = new TreeNode(preorder[prel]);
root->left = dfs(preorder, inorder, prel + 1, prel + size, inl, index - 1);
root->right = dfs(preorder, inorder, prel + size + 1, prer, index + 1, inr);
return root;
}
};