/**
* 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:
map<int,int> hash;
vector<int> preorder,inorder;
TreeNode* dfs(int pl,int pr, int il,int ir)
{
if(pl > pr) return nullptr;
auto root = new TreeNode(preorder[pl]);
//k为preorder[pl]在中序遍历序列中的下标
int k = hash[root->val];
//递归构建左右子树
auto left = dfs(pl+1,pl+1+k-il-1,il,k-1);
auto right = dfs(pl+k-il+1,pr,k+1,ir);
root->left = left;
root->right = right;
return root;
}
TreeNode* buildTree(vector<int>& _preorder, vector<int>& _inorder) {
preorder = _preorder;
inorder = _inorder;
//利用哈希表,将前序遍历映射到中序遍历中,方便查找前序遍历元素在中序遍历序列中的位置
for(int i = 0;i < inorder.size();i++)
hash[inorder[i]] = i;
return dfs(0,preorder.size()-1,0,inorder.size()-1);
}
};
01-11
541

05-31