面试题7:重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点,假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
// 递归法
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
this->preorder = preorder; // this调用上一层的preorder
for(int i=0;i<preorder.size();i++)
dic[inorder[i]] = i; // dic是inorder的哈希表:[9]:0;[3]:1;......
return recur(0,0,preorder.size()-1);
}
private:
vector<int> preorder;
unordered_map<int,int> dic; //建立哈希表
TreeNode* recur(int root,int left,int right)
{
if(left>right) return nullptr; // 迭代终止
TreeNode* node = new TreeNode(preorder[root]);
int i = dic[preorder[root]];
node->left = recur(root+1,left,i-1);
node->right = recur(root+i-left+1,i+1,right); // root+(i-left)+1
return node;
}
};