/**
* 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 {
map<int,int> mp;
TreeNode* dfs(vector<int>& preorder, int pl, int pr, vector<int>& inorder, int il, int ir)
{
if(pr < pl) return nullptr;
TreeNode* root = new TreeNode(preorder[pl]);
int leftlen = mp[preorder[pl]] - il;//
int rightlen = ir - mp[preorder[pl]];
root->left = dfs(preorder, pl + 1, pl + leftlen, inorder, il, mp[preorder[pl]] - 1);
root->right = dfs(preorder, pl + leftlen + 1, pr, inorder, mp[preorder[pl]] + 1, ir);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
for(int i = 0; i < inorder.size(); i++)
mp[inorder[i]] = i;
return dfs(preorder,0, preorder.size() - 1,inorder, 0, inorder.size() - 1);
}
};
第二次写题
/**
* 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 {
map<int, int> mp; //val pos
TreeNode* dfs(vector<int>& preorder, int ps, int pe, vector<int>& inorder, int is, int ie)
{
if(ps > pe) return nullptr;
TreeNode* root = new TreeNode(preorder[ps]);
// cout << preorder[ps] << endl;;
int mid = mp[preorder[ps]];
int leftlen = mid - is;
int rightlen = ie - mid;
root->left = dfs(preorder, ps + 1, ps + 1 + leftlen - 1, inorder, is, mid - 1);
root->right = dfs(preorder, ps + leftlen + 1, pe, inorder, mid + 1, ie);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
for(int i = 0; i < inorder.size(); i++)
mp[inorder[i]] = i;
return dfs(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
};