- 从前序与中序遍历序列构造二叉树
难度:中等
class Solution {
public:
TreeNode *fun(vector<int>& preorder,int preleft, int preright, map<int,int> &map_ValToIndex, int inleft , int inright ) {
if(preleft>preright || inleft>inright)return NULL;
TreeNode *root = new TreeNode(preorder[preleft]);
// preleft = preleft+1;
// inright = map_ValToIndex[preorder[preleft]]-1;
// preright = inright-inleft+preleft;
// @主要就是计算出根节点的左右子树的边界
root->left = fun(preorder, preleft+1, map_ValToIndex[preorder[preleft]]-1-inleft+preleft+1,
map_ValToIndex, inleft, map_ValToIndex[preorder[preleft]]-1);
root->right = fun(preorder, map_ValToIndex[preorder[preleft]]-1-inleft+preleft+1+1, preright,
map_ValToIndex, map_ValToIndex[preorder[preleft]]+1, inright);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
map<int,int> map_ValToIndex;
for(int i=0;i<inorder.size();i++)
{
map_ValToIndex[inorder[i]] = i;
}
return fun(preorder,0,preorder.size()-1 ,map_ValToIndex , 0 ,inorder.size()-1);
}
};
执行结果:
通过
执行用时:
16 ms, 在所有 C++ 提交中击败了75.83%的用户
内存消耗:
25.7 MB, 在所有 C++ 提交中击败了42.36%的用户
通过测试用例:
203 / 203