地址:
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
描述:
思路:
代码:
class Solution {
public:
//根据中序遍历数组建立哈希表,方便根据前序遍历的值找到中序遍历中位置
unordered_map<int,int> in;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int l=preorder.size();
for(int i=0;i<l;i++) in[inorder[i]]=i;
return dfs(preorder,inorder,0,l-1,0,l-1);
}
//pl,pr、il,ir分别代表前序、中序遍历数组的始末位置
TreeNode* dfs(vector<int>&preorder,vector<int>&inorder,int pl,int pr,int il,int ir){
//递归的终止条件,比如当左子树只有一个值时,pl+1>pl+len(没有左子树因此len=0),
//这时候就返回NULL
if(pl>pr) return NULL;
//首先通过哈希表找到前序遍历中第一个值在中序遍历中位置
int val=preorder[pl];
//根据key值找位置
int location=in[val];
//根据根节点的位置找到左子树的长度
int len=location-il;
TreeNode *root=new TreeNode(val);
//pl,pr、il,ir分别代表前序、中序遍历数组的始末位置
root->left=dfs(preorder,inorder,pl+1,pl+len,il,location-1);
root->right=dfs(preorder,inorder,pl+len+1,pr,location+1,ir);
return root;
}
};