AcWing 18-重建二叉树
题意:输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。
常规的用递归方法,二叉树的遍历序列通过vector存出,这时候可以用map建立一个哈希表,方便找到根节点在中序遍历的位置从而分开左右子树。
求出左子树和右子树在序列中的区间范围,不断递归。
/**
* 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:
vector<int> preorder,inorder;
map<int,int>hash;
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);
}
TreeNode* dfs(int pl,int pr,int il,int ir)
{
if(pl>pr) return nullptr;
auto root=new TreeNode(preorder[pl]);
int k=hash[root->val];
auto left=dfs(pl+1,pl+k-il,il,k-1);
auto right=dfs(pl+k-il+1,pr,k+1,ir);
root->left=left,root->right=right;
return root;
}
};