题目: 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
限制:
0 <= 节点个数 <= 5000
解题:
- 前序遍历:先访问根结点,再访问左子结点,最后访问右子结点。
- 中序遍历:先访问左子结点,再访问根结点,最后访问右子结点。
- 后序遍历:先访问左子结点,再访问右子结点,最后访问根结点。
/**
* 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:
unordered_map<int, int> mp;
vector<int> Pre, In;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
Pre = preorder, In = inorder;
int n = Pre.size();
for(int i = 0; i < n; i++) mp[In[i]] = i;
return dfs(0, n-1, 0, n-1);
}
TreeNode* dfs(int pL, int pR, int inL, int inR){
if(pL > pR) return nullptr;
auto root = new TreeNode(Pre[pL]);
int k = mp[root->val];
int left = k - inL;
root->left = dfs(pL+1, pL + left, inL, k - 1);
root->right = dfs(pL + left + 1, pR, k + 1, inR);
return root;
}
};